Mercurial > cpython-lru_cache-weakref
annotate Python/ceval.c @ 53787:c6376d3fa968
Issue #5920: Changed format.__float__ and complex.__float__ to use a precision of 12 when using the empty presentation type. This more closely matches str()'s behavior and reduces surprises when adding alignment flags to an empty format string. Patch by Mark Dickinson.
| author | Eric Smith <eric@trueblade.com> |
|---|---|
| date | Tue, 05 May 2009 14:04:18 +0000 |
| parents | 3722ce458318 |
| children | 4e96d7daf79f |
| 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" |
| 926 | 16 #include "eval.h" |
| 69 | 17 #include "opcode.h" |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18611
diff
changeset
|
18 #include "structmember.h" |
| 69 | 19 |
|
1400
aac8231a715c
* mpzmodule.c: removed redundant mpz_print function.
Guido van Rossum <guido@python.org>
parents:
1391
diff
changeset
|
20 #include <ctype.h> |
|
aac8231a715c
* mpzmodule.c: removed redundant mpz_print function.
Guido van Rossum <guido@python.org>
parents:
1391
diff
changeset
|
21 |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
22 #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
|
23 |
|
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 #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
|
25 |
|
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
|
26 #else |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
27 |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
28 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
|
29 |
| 33104 | 30 #if defined(__ppc__) /* <- Don't know if this is the correct symbol; this |
|
43418
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
31 section should work for GCC on any PowerPC |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
32 platform, irrespective of OS. |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
33 POWER? Who knows :-) */ |
| 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 { | |
| 40 register unsigned long tbu, tb, tbu2; | |
| 41 | |
| 42 loop: | |
| 43 asm volatile ("mftbu %0" : "=r" (tbu) ); | |
| 44 asm volatile ("mftb %0" : "=r" (tb) ); | |
| 45 asm volatile ("mftbu %0" : "=r" (tbu2)); | |
| 46 if (__builtin_expect(tbu != tbu2, 0)) goto loop; | |
| 47 | |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
48 /* The slightly peculiar way of writing the next lines is |
| 33104 | 49 compiled better by GCC than any other way I tried. */ |
| 50 ((long*)(v))[0] = tbu; | |
| 51 ((long*)(v))[1] = tb; | |
| 52 } | |
| 53 | |
|
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
|
54 #else /* this is for linux/x86 (and probably any other GCC/x86 combo) */ |
|
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
|
55 |
|
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
|
56 #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
|
57 __asm__ __volatile__("rdtsc" : "=A" (val)) |
| 33104 | 58 |
| 59 #endif | |
| 60 | |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
61 void dump_tsc(int opcode, int ticked, uint64 inst0, uint64 inst1, |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
62 uint64 loop0, uint64 loop1, uint64 intr0, uint64 intr1) |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
63 { |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
64 uint64 intr, inst, loop; |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
65 PyThreadState *tstate = PyThreadState_Get(); |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
66 if (!tstate->interp->tscdump) |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
67 return; |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
68 intr = intr1 - intr0; |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
69 inst = inst1 - inst0 - intr; |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
70 loop = loop1 - loop0 - intr; |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
71 fprintf(stderr, "opcode=%03d t=%d inst=%06lld loop=%06lld\n", |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
72 opcode, ticked, inst, loop); |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
73 } |
| 33104 | 74 |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
75 #endif |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
76 |
|
944
222f04f55083
Changes so that user-defined classes can implement operations invoked
Guido van Rossum <guido@python.org>
parents:
926
diff
changeset
|
77 /* 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
|
78 /* #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
|
79 |
|
4839
4567e158d20c
Rename DEBUG macro to Py_DEBUG
Guido van Rossum <guido@python.org>
parents:
4667
diff
changeset
|
80 #ifdef Py_DEBUG |
| 567 | 81 /* For debugging the interpreter: */ |
| 82 #define LLTRACE 1 /* Low-level trace feature */ | |
| 83 #define CHECKEXC 1 /* Double-check exception checking */ | |
| 69 | 84 #endif |
| 85 | |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
86 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
|
87 |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
88 /* Forward declarations */ |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
89 #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
|
90 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
|
91 #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
|
92 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
|
93 #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
|
94 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
|
95 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
|
96 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
|
97 static PyObject * update_keyword_args(PyObject *, int, PyObject ***, |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
98 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
|
99 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
|
100 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
|
101 #define CALL_FLAG_VAR 1 |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
102 #define CALL_FLAG_KW 2 |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
103 |
|
746
6c0f16008bd9
lint (added prototypes for all static fns)
Guido van Rossum <guido@python.org>
parents:
708
diff
changeset
|
104 #ifdef LLTRACE |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36580
diff
changeset
|
105 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
|
106 static int prtrace(PyObject *, char *); |
|
746
6c0f16008bd9
lint (added prototypes for all static fns)
Guido van Rossum <guido@python.org>
parents:
708
diff
changeset
|
107 #endif |
|
18326
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
108 static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *, |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
109 int, PyObject *); |
|
43840
73c8e27eb9ce
Correction for issue1265 (pdb bug with "with" statement).
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
43815
diff
changeset
|
110 static int call_trace_protected(Py_tracefunc, PyObject *, |
|
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
|
111 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
|
112 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
|
113 static int maybe_call_line_trace(Py_tracefunc, PyObject *, |
| 31768 | 114 PyFrameObject *, int *, int *, int *); |
| 24844 | 115 |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
116 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
|
117 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
|
118 static int import_all_from(PyObject *, PyObject *); |
| 42860 | 119 static void format_exc_check_arg(PyObject *, const char *, PyObject *); |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43569
diff
changeset
|
120 static PyObject * unicode_concatenate(PyObject *, PyObject *, |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43569
diff
changeset
|
121 PyFrameObject *, unsigned char *); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
122 |
|
14268
cd8b815cb196
Better error message with UnboundLocalError
Paul Prescod <prescod@prescod.net>
parents:
14238
diff
changeset
|
123 #define NAME_ERROR_MSG \ |
| 15318 | 124 "name '%.200s' is not defined" |
|
16257
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16017
diff
changeset
|
125 #define GLOBAL_NAME_ERROR_MSG \ |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16017
diff
changeset
|
126 "global name '%.200s' is not defined" |
|
14268
cd8b815cb196
Better error message with UnboundLocalError
Paul Prescod <prescod@prescod.net>
parents:
14238
diff
changeset
|
127 #define UNBOUNDLOCAL_ERROR_MSG \ |
| 15318 | 128 "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
|
129 #define UNBOUNDFREE_ERROR_MSG \ |
|
a34293ced63b
Change error message raised when free variable is not yet bound. It
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17490
diff
changeset
|
130 "free variable '%.200s' referenced before assignment" \ |
|
a34293ced63b
Change error message raised when free variable is not yet bound. It
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17490
diff
changeset
|
131 " in enclosing scope" |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
132 |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
133 /* Dynamic execution profile */ |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
134 #ifdef DYNAMIC_EXECUTION_PROFILE |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
135 #ifdef DXPAIRS |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
136 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
|
137 #define dxp dxpairs[256] |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
138 #else |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
139 static long dxp[256]; |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
140 #endif |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
141 #endif |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
142 |
|
27712
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
143 /* 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
|
144 #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
|
145 #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
|
146 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
|
147 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
148 #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
|
149 #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
|
150 #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
|
151 #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
|
152 #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
|
153 #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
|
154 #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
|
155 #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
|
156 #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
|
157 #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
|
158 #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
|
159 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
160 /* 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
|
161 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
162 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
|
163 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
164 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
|
165 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
|
166 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
167 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
|
168 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
|
169 twice. |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
170 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
171 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
|
172 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
|
173 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
|
174 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
|
175 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
|
176 */ |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
177 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
178 #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
|
179 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
180 PyObject * |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
181 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
|
182 { |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40381
diff
changeset
|
183 return Py_BuildValue("iiiiiiiiiii", |
|
27712
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
184 pcall[0], pcall[1], pcall[2], pcall[3], |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
185 pcall[4], pcall[5], pcall[6], pcall[7], |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40381
diff
changeset
|
186 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
|
187 } |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
188 #else |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
189 #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
|
190 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
191 PyObject * |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
192 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
|
193 { |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
194 Py_INCREF(Py_None); |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
195 return Py_None; |
|
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 #endif |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
198 |
|
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
|
199 |
|
1846
5243fb187d36
call_object: print message before abort()
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
200 #ifdef WITH_THREAD |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
201 |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
39222
diff
changeset
|
202 #ifdef HAVE_ERRNO_H |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
203 #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
|
204 #endif |
|
9203
07dae6fdae79
Renamed thread.h to pythread.h.
Guido van Rossum <guido@python.org>
parents:
9048
diff
changeset
|
205 #include "pythread.h" |
| 926 | 206 |
|
29643
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
29349
diff
changeset
|
207 static PyThread_type_lock interpreter_lock = 0; /* This is the GIL */ |
|
50839
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
208 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
|
209 static long main_thread = 0; |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
210 |
|
33715
a46b76eb9053
SF patch 1044089: New C API function PyEval_ThreadsInitialized(), by Nick
Tim Peters <tim.peters@gmail.com>
parents:
33501
diff
changeset
|
211 int |
|
a46b76eb9053
SF patch 1044089: New C API function PyEval_ThreadsInitialized(), by Nick
Tim Peters <tim.peters@gmail.com>
parents:
33501
diff
changeset
|
212 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
|
213 { |
|
a46b76eb9053
SF patch 1044089: New C API function PyEval_ThreadsInitialized(), by Nick
Tim Peters <tim.peters@gmail.com>
parents:
33501
diff
changeset
|
214 return interpreter_lock != 0; |
|
a46b76eb9053
SF patch 1044089: New C API function PyEval_ThreadsInitialized(), by Nick
Tim Peters <tim.peters@gmail.com>
parents:
33501
diff
changeset
|
215 } |
|
a46b76eb9053
SF patch 1044089: New C API function PyEval_ThreadsInitialized(), by Nick
Tim Peters <tim.peters@gmail.com>
parents:
33501
diff
changeset
|
216 |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
217 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
218 PyEval_InitThreads(void) |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
219 { |
|
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
220 if (interpreter_lock) |
| 1179 | 221 return; |
|
9679
877d23bd5bdc
Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents:
9671
diff
changeset
|
222 interpreter_lock = PyThread_allocate_lock(); |
|
877d23bd5bdc
Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents:
9671
diff
changeset
|
223 PyThread_acquire_lock(interpreter_lock, 1); |
|
877d23bd5bdc
Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents:
9671
diff
changeset
|
224 main_thread = PyThread_get_thread_ident(); |
| 926 | 225 } |
| 226 | |
|
5865
9841bce37c4d
Moved PyEval_{Acquire,Release}Thread() to within the same #ifdef
Guido van Rossum <guido@python.org>
parents:
5846
diff
changeset
|
227 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
228 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
|
229 { |
|
9679
877d23bd5bdc
Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents:
9671
diff
changeset
|
230 PyThread_acquire_lock(interpreter_lock, 1); |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5911
diff
changeset
|
231 } |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5911
diff
changeset
|
232 |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5911
diff
changeset
|
233 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
234 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
|
235 { |
|
9679
877d23bd5bdc
Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents:
9671
diff
changeset
|
236 PyThread_release_lock(interpreter_lock); |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5911
diff
changeset
|
237 } |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5911
diff
changeset
|
238 |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5911
diff
changeset
|
239 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
240 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
|
241 { |
|
9841bce37c4d
Moved PyEval_{Acquire,Release}Thread() to within the same #ifdef
Guido van Rossum <guido@python.org>
parents:
5846
diff
changeset
|
242 if (tstate == NULL) |
|
9841bce37c4d
Moved PyEval_{Acquire,Release}Thread() to within the same #ifdef
Guido van Rossum <guido@python.org>
parents:
5846
diff
changeset
|
243 Py_FatalError("PyEval_AcquireThread: NULL new thread state"); |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28556
diff
changeset
|
244 /* Check someone has called PyEval_InitThreads() to create the lock */ |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28556
diff
changeset
|
245 assert(interpreter_lock); |
|
9679
877d23bd5bdc
Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents:
9671
diff
changeset
|
246 PyThread_acquire_lock(interpreter_lock, 1); |
|
5865
9841bce37c4d
Moved PyEval_{Acquire,Release}Thread() to within the same #ifdef
Guido van Rossum <guido@python.org>
parents:
5846
diff
changeset
|
247 if (PyThreadState_Swap(tstate) != NULL) |
|
9841bce37c4d
Moved PyEval_{Acquire,Release}Thread() to within the same #ifdef
Guido van Rossum <guido@python.org>
parents:
5846
diff
changeset
|
248 Py_FatalError( |
|
9841bce37c4d
Moved PyEval_{Acquire,Release}Thread() to within the same #ifdef
Guido van Rossum <guido@python.org>
parents:
5846
diff
changeset
|
249 "PyEval_AcquireThread: non-NULL old thread state"); |
|
9841bce37c4d
Moved PyEval_{Acquire,Release}Thread() to within the same #ifdef
Guido van Rossum <guido@python.org>
parents:
5846
diff
changeset
|
250 } |
|
9841bce37c4d
Moved PyEval_{Acquire,Release}Thread() to within the same #ifdef
Guido van Rossum <guido@python.org>
parents:
5846
diff
changeset
|
251 |
|
9841bce37c4d
Moved PyEval_{Acquire,Release}Thread() to within the same #ifdef
Guido van Rossum <guido@python.org>
parents:
5846
diff
changeset
|
252 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
253 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
|
254 { |
|
9841bce37c4d
Moved PyEval_{Acquire,Release}Thread() to within the same #ifdef
Guido van Rossum <guido@python.org>
parents:
5846
diff
changeset
|
255 if (tstate == NULL) |
|
9841bce37c4d
Moved PyEval_{Acquire,Release}Thread() to within the same #ifdef
Guido van Rossum <guido@python.org>
parents:
5846
diff
changeset
|
256 Py_FatalError("PyEval_ReleaseThread: NULL thread state"); |
|
9841bce37c4d
Moved PyEval_{Acquire,Release}Thread() to within the same #ifdef
Guido van Rossum <guido@python.org>
parents:
5846
diff
changeset
|
257 if (PyThreadState_Swap(NULL) != tstate) |
|
9841bce37c4d
Moved PyEval_{Acquire,Release}Thread() to within the same #ifdef
Guido van Rossum <guido@python.org>
parents:
5846
diff
changeset
|
258 Py_FatalError("PyEval_ReleaseThread: wrong thread state"); |
|
9679
877d23bd5bdc
Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents:
9671
diff
changeset
|
259 PyThread_release_lock(interpreter_lock); |
|
5865
9841bce37c4d
Moved PyEval_{Acquire,Release}Thread() to within the same #ifdef
Guido van Rossum <guido@python.org>
parents:
5846
diff
changeset
|
260 } |
|
14225
cbe9590d2344
Charles Waldman's patch to reinitialize the interpreter lock after a
Guido van Rossum <guido@python.org>
parents:
14163
diff
changeset
|
261 |
|
cbe9590d2344
Charles Waldman's patch to reinitialize the interpreter lock after a
Guido van Rossum <guido@python.org>
parents:
14163
diff
changeset
|
262 /* 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
|
263 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
|
264 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
|
265 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
|
266 |
|
cbe9590d2344
Charles Waldman's patch to reinitialize the interpreter lock after a
Guido van Rossum <guido@python.org>
parents:
14163
diff
changeset
|
267 void |
|
cbe9590d2344
Charles Waldman's patch to reinitialize the interpreter lock after a
Guido van Rossum <guido@python.org>
parents:
14163
diff
changeset
|
268 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
|
269 { |
| 48516 | 270 PyObject *threading, *result; |
| 271 PyThreadState *tstate; | |
| 272 | |
|
14225
cbe9590d2344
Charles Waldman's patch to reinitialize the interpreter lock after a
Guido van Rossum <guido@python.org>
parents:
14163
diff
changeset
|
273 if (!interpreter_lock) |
|
cbe9590d2344
Charles Waldman's patch to reinitialize the interpreter lock after a
Guido van Rossum <guido@python.org>
parents:
14163
diff
changeset
|
274 return; |
|
cbe9590d2344
Charles Waldman's patch to reinitialize the interpreter lock after a
Guido van Rossum <guido@python.org>
parents:
14163
diff
changeset
|
275 /*XXX Can't use PyThread_free_lock here because it does too |
|
cbe9590d2344
Charles Waldman's patch to reinitialize the interpreter lock after a
Guido van Rossum <guido@python.org>
parents:
14163
diff
changeset
|
276 much error-checking. Doing this cleanly would require |
|
cbe9590d2344
Charles Waldman's patch to reinitialize the interpreter lock after a
Guido van Rossum <guido@python.org>
parents:
14163
diff
changeset
|
277 adding a new function to each thread_*.h. Instead, just |
|
cbe9590d2344
Charles Waldman's patch to reinitialize the interpreter lock after a
Guido van Rossum <guido@python.org>
parents:
14163
diff
changeset
|
278 create a new lock and waste a little bit of memory */ |
|
cbe9590d2344
Charles Waldman's patch to reinitialize the interpreter lock after a
Guido van Rossum <guido@python.org>
parents:
14163
diff
changeset
|
279 interpreter_lock = PyThread_allocate_lock(); |
|
50839
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
280 pending_lock = PyThread_allocate_lock(); |
|
14225
cbe9590d2344
Charles Waldman's patch to reinitialize the interpreter lock after a
Guido van Rossum <guido@python.org>
parents:
14163
diff
changeset
|
281 PyThread_acquire_lock(interpreter_lock, 1); |
|
cbe9590d2344
Charles Waldman's patch to reinitialize the interpreter lock after a
Guido van Rossum <guido@python.org>
parents:
14163
diff
changeset
|
282 main_thread = PyThread_get_thread_ident(); |
| 48516 | 283 |
| 284 /* Update the threading module with the new state. | |
| 285 */ | |
| 286 tstate = PyThreadState_GET(); | |
| 287 threading = PyMapping_GetItemString(tstate->interp->modules, | |
| 288 "threading"); | |
| 289 if (threading == NULL) { | |
| 290 /* threading not imported */ | |
| 291 PyErr_Clear(); | |
| 292 return; | |
| 293 } | |
| 294 result = PyObject_CallMethod(threading, "_after_fork", NULL); | |
| 295 if (result == NULL) | |
| 296 PyErr_WriteUnraisable(threading); | |
| 297 else | |
| 298 Py_DECREF(result); | |
| 299 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
|
300 } |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
301 #endif |
| 926 | 302 |
| 303 /* Functions save_thread and restore_thread are always defined so | |
| 304 dynamically loaded modules needn't be compiled separately for use | |
| 305 with and without threads: */ | |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
306 |
|
5846
852a1fa62a7c
PyEval_SaveThread() and PyEval_RestoreThread() now return/take a
Guido van Rossum <guido@python.org>
parents:
5829
diff
changeset
|
307 PyThreadState * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
308 PyEval_SaveThread(void) |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
309 { |
|
6365
21b93d98926b
Change PyEval_SaveThread() and PyEval_RestoreThread() to always do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
310 PyThreadState *tstate = PyThreadState_Swap(NULL); |
|
21b93d98926b
Change PyEval_SaveThread() and PyEval_RestoreThread() to always do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
311 if (tstate == NULL) |
|
21b93d98926b
Change PyEval_SaveThread() and PyEval_RestoreThread() to always do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
312 Py_FatalError("PyEval_SaveThread: NULL tstate"); |
|
1846
5243fb187d36
call_object: print message before abort()
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
313 #ifdef WITH_THREAD |
|
6365
21b93d98926b
Change PyEval_SaveThread() and PyEval_RestoreThread() to always do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
314 if (interpreter_lock) |
|
9679
877d23bd5bdc
Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents:
9671
diff
changeset
|
315 PyThread_release_lock(interpreter_lock); |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
316 #endif |
|
6365
21b93d98926b
Change PyEval_SaveThread() and PyEval_RestoreThread() to always do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
317 return tstate; |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
318 } |
|
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
319 |
|
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
320 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
321 PyEval_RestoreThread(PyThreadState *tstate) |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
322 { |
|
6365
21b93d98926b
Change PyEval_SaveThread() and PyEval_RestoreThread() to always do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
323 if (tstate == NULL) |
|
21b93d98926b
Change PyEval_SaveThread() and PyEval_RestoreThread() to always do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
324 Py_FatalError("PyEval_RestoreThread: NULL tstate"); |
|
1846
5243fb187d36
call_object: print message before abort()
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
325 #ifdef WITH_THREAD |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
326 if (interpreter_lock) { |
|
6365
21b93d98926b
Change PyEval_SaveThread() and PyEval_RestoreThread() to always do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
327 int err = errno; |
|
9679
877d23bd5bdc
Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents:
9671
diff
changeset
|
328 PyThread_acquire_lock(interpreter_lock, 1); |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
329 errno = err; |
|
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
330 } |
|
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
331 #endif |
|
6365
21b93d98926b
Change PyEval_SaveThread() and PyEval_RestoreThread() to always do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
332 PyThreadState_Swap(tstate); |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
333 } |
|
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
334 |
|
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
335 |
|
1887
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
336 /* 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
|
337 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
|
338 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
|
339 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
|
340 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
|
341 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
|
342 |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
343 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
|
344 (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
|
345 an exception condition). |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
346 |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
347 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
|
348 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
|
349 |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
350 #ifdef WITH_THREAD |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
351 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
|
352 will execute them. |
|
50839
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
353 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
|
354 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
|
355 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
|
356 threadstate. |
|
1887
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
357 #endif |
|
50839
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
358 */ |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
359 |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
360 #ifdef WITH_THREAD |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
361 |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
362 /* 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
|
363 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
|
364 callback. |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
365 */ |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
366 |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
367 #define NPENDINGCALLS 32 |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
368 static struct { |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
369 int (*func)(void *); |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
370 void *arg; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
371 } pendingcalls[NPENDINGCALLS]; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
372 static int pendingfirst = 0; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
373 static int pendinglast = 0; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
374 static volatile int pendingcalls_to_do = 1; /* trigger initialization of lock */ |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
375 static char pendingbusy = 0; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
376 |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
377 int |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
378 Py_AddPendingCall(int (*func)(void *), void *arg) |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
379 { |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
380 int i, j, result=0; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
381 PyThread_type_lock lock = pending_lock; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
382 |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
383 /* try a few times for the lock. Since this mechanism is used |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
384 * for signal handling (on the main thread), there is a (slim) |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
385 * chance that a signal is delivered on the same thread while we |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
386 * hold the lock during the Py_MakePendingCalls() function. |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
387 * This avoids a deadlock in that case. |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
388 * Note that signals can be delivered on any thread. In particular, |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
389 * on Windows, a SIGINT is delivered on a system-created worker |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
390 * thread. |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
391 * We also check for lock being NULL, in the unlikely case that |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
392 * this function is called before any bytecode evaluation takes place. |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
393 */ |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
394 if (lock != NULL) { |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
395 for (i = 0; i<100; i++) { |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
396 if (PyThread_acquire_lock(lock, NOWAIT_LOCK)) |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
397 break; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
398 } |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
399 if (i == 100) |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
400 return -1; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
401 } |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
402 |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
403 i = pendinglast; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
404 j = (i + 1) % NPENDINGCALLS; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
405 if (j == pendingfirst) { |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
406 result = -1; /* Queue full */ |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
407 } else { |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
408 pendingcalls[i].func = func; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
409 pendingcalls[i].arg = arg; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
410 pendinglast = j; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
411 } |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
412 /* signal main loop */ |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
413 _Py_Ticker = 0; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
414 pendingcalls_to_do = 1; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
415 if (lock != NULL) |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
416 PyThread_release_lock(lock); |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
417 return result; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
418 } |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
419 |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
420 int |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
421 Py_MakePendingCalls(void) |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
422 { |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
423 int i; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
424 int r = 0; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
425 |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
426 if (!pending_lock) { |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
427 /* initial allocation of the lock */ |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
428 pending_lock = PyThread_allocate_lock(); |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
429 if (pending_lock == NULL) |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
430 return -1; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
431 } |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
432 |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
433 /* only service pending calls on main thread */ |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
434 if (main_thread && PyThread_get_thread_ident() != main_thread) |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
435 return 0; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
436 /* don't perform recursive pending calls */ |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
437 if (pendingbusy) |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
438 return 0; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
439 pendingbusy = 1; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
440 /* perform a bounded number of calls, in case of recursion */ |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
441 for (i=0; i<NPENDINGCALLS; i++) { |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
442 int j; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
443 int (*func)(void *); |
|
50840
29edf26b9c23
fix compiler warning
Benjamin Peterson <benjamin@python.org>
parents:
50839
diff
changeset
|
444 void *arg = NULL; |
|
50839
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
445 |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
446 /* pop one item off the queue while holding the lock */ |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
447 PyThread_acquire_lock(pending_lock, WAIT_LOCK); |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
448 j = pendingfirst; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
449 if (j == pendinglast) { |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
450 func = NULL; /* Queue empty */ |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
451 } else { |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
452 func = pendingcalls[j].func; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
453 arg = pendingcalls[j].arg; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
454 pendingfirst = (j + 1) % NPENDINGCALLS; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
455 } |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
456 pendingcalls_to_do = pendingfirst != pendinglast; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
457 PyThread_release_lock(pending_lock); |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
458 /* having released the lock, perform the callback */ |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
459 if (func == NULL) |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
460 break; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
461 r = func(arg); |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
462 if (r) |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
463 break; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
464 } |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
465 pendingbusy = 0; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
466 return r; |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
467 } |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
468 |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
469 #else /* if ! defined WITH_THREAD */ |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
470 |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
471 /* |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
472 WARNING! ASYNCHRONOUSLY EXECUTING CODE! |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
473 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
|
474 with WITH_THREAD. |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
475 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
|
476 on a different thread! |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
477 |
|
1887
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
478 There are two possible race conditions: |
|
50839
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
479 (1) nested asynchronous calls to Py_AddPendingCall() |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
480 (2) AddPendingCall() calls made while pending calls are being processed. |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
481 |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
482 (1) is very unlikely because typically signal delivery |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
483 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
|
484 (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
|
485 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
|
486 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
|
487 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
|
488 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
|
489 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
|
490 Windows really shouldn't use this version. |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
491 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
|
492 */ |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
493 |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
494 #define NPENDINGCALLS 32 |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
495 static struct { |
|
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
|
496 int (*func)(void *); |
|
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
|
497 void *arg; |
|
1887
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
498 } pendingcalls[NPENDINGCALLS]; |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
499 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
|
500 static volatile int pendinglast = 0; |
|
50839
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
501 static volatile 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
|
502 |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
503 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
|
504 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
|
505 { |
| 32526 | 506 static volatile int busy = 0; |
|
1887
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
507 int i, j; |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
508 /* XXX Begin critical section */ |
|
1914
893412101296
* Python/ceval.c, Include/ceval.h: promote MakePendingCalls to
Guido van Rossum <guido@python.org>
parents:
1887
diff
changeset
|
509 if (busy) |
|
893412101296
* Python/ceval.c, Include/ceval.h: promote MakePendingCalls to
Guido van Rossum <guido@python.org>
parents:
1887
diff
changeset
|
510 return -1; |
|
893412101296
* Python/ceval.c, Include/ceval.h: promote MakePendingCalls to
Guido van Rossum <guido@python.org>
parents:
1887
diff
changeset
|
511 busy = 1; |
|
1887
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
512 i = pendinglast; |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
513 j = (i + 1) % NPENDINGCALLS; |
|
24284
d8909792005a
SF patch 552161 - Py_AddPendingCall doesn't unlock on fail (Daniel
Guido van Rossum <guido@python.org>
parents:
24283
diff
changeset
|
514 if (j == pendingfirst) { |
|
d8909792005a
SF patch 552161 - Py_AddPendingCall doesn't unlock on fail (Daniel
Guido van Rossum <guido@python.org>
parents:
24283
diff
changeset
|
515 busy = 0; |
|
1887
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
516 return -1; /* Queue full */ |
|
24284
d8909792005a
SF patch 552161 - Py_AddPendingCall doesn't unlock on fail (Daniel
Guido van Rossum <guido@python.org>
parents:
24283
diff
changeset
|
517 } |
|
1887
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
518 pendingcalls[i].func = func; |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
519 pendingcalls[i].arg = arg; |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
520 pendinglast = j; |
|
25108
3a26e352f0a6
replace thread state objects' ticker and checkinterval fields with two
Skip Montanaro <skip@pobox.com>
parents:
25078
diff
changeset
|
521 |
|
3a26e352f0a6
replace thread state objects' ticker and checkinterval fields with two
Skip Montanaro <skip@pobox.com>
parents:
25078
diff
changeset
|
522 _Py_Ticker = 0; |
|
50839
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
523 pendingcalls_to_do = 1; /* Signal main loop */ |
|
1914
893412101296
* Python/ceval.c, Include/ceval.h: promote MakePendingCalls to
Guido van Rossum <guido@python.org>
parents:
1887
diff
changeset
|
524 busy = 0; |
|
1887
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
525 /* XXX End critical section */ |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
526 return 0; |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
527 } |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
528 |
|
1914
893412101296
* Python/ceval.c, Include/ceval.h: promote MakePendingCalls to
Guido van Rossum <guido@python.org>
parents:
1887
diff
changeset
|
529 int |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
530 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
|
531 { |
|
1914
893412101296
* Python/ceval.c, Include/ceval.h: promote MakePendingCalls to
Guido van Rossum <guido@python.org>
parents:
1887
diff
changeset
|
532 static int busy = 0; |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5368
diff
changeset
|
533 if (busy) |
|
1914
893412101296
* Python/ceval.c, Include/ceval.h: promote MakePendingCalls to
Guido van Rossum <guido@python.org>
parents:
1887
diff
changeset
|
534 return 0; |
|
893412101296
* Python/ceval.c, Include/ceval.h: promote MakePendingCalls to
Guido van Rossum <guido@python.org>
parents:
1887
diff
changeset
|
535 busy = 1; |
|
50839
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
536 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
|
537 for (;;) { |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
538 int i; |
|
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
|
539 int (*func)(void *); |
|
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
|
540 void *arg; |
|
1887
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
541 i = pendingfirst; |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
542 if (i == pendinglast) |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
543 break; /* Queue empty */ |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
544 func = pendingcalls[i].func; |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
545 arg = pendingcalls[i].arg; |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
546 pendingfirst = (i + 1) % NPENDINGCALLS; |
|
1914
893412101296
* Python/ceval.c, Include/ceval.h: promote MakePendingCalls to
Guido van Rossum <guido@python.org>
parents:
1887
diff
changeset
|
547 if (func(arg) < 0) { |
|
893412101296
* Python/ceval.c, Include/ceval.h: promote MakePendingCalls to
Guido van Rossum <guido@python.org>
parents:
1887
diff
changeset
|
548 busy = 0; |
|
50839
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
549 pendingcalls_to_do = 1; /* We're not done yet */ |
|
1887
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
550 return -1; |
|
1914
893412101296
* Python/ceval.c, Include/ceval.h: promote MakePendingCalls to
Guido van Rossum <guido@python.org>
parents:
1887
diff
changeset
|
551 } |
|
1887
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
552 } |
|
1914
893412101296
* Python/ceval.c, Include/ceval.h: promote MakePendingCalls to
Guido van Rossum <guido@python.org>
parents:
1887
diff
changeset
|
553 busy = 0; |
|
1887
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
554 return 0; |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
555 } |
|
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
556 |
|
50839
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
557 #endif /* WITH_THREAD */ |
|
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
558 |
|
1887
e7c6a18381d9
* Python/ceval.c (eval_code): added registry of pending functions
Guido van Rossum <guido@python.org>
parents:
1846
diff
changeset
|
559 |
|
14308
b8b3f76ffd51
add user-modifiable recursion_limit
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14268
diff
changeset
|
560 /* The interpreter's recursion limit */ |
|
b8b3f76ffd51
add user-modifiable recursion_limit
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14268
diff
changeset
|
561 |
|
34863
71fd7ee4b7f5
Make a handy macro, Py_DEFAULT_RECURSION_LIMIT to allow to define
Hye-Shik Chang <hyeshik@gmail.com>
parents:
34442
diff
changeset
|
562 #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
|
563 #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
|
564 #endif |
|
71fd7ee4b7f5
Make a handy macro, Py_DEFAULT_RECURSION_LIMIT to allow to define
Hye-Shik Chang <hyeshik@gmail.com>
parents:
34442
diff
changeset
|
565 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
|
566 int _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT; |
|
14308
b8b3f76ffd51
add user-modifiable recursion_limit
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14268
diff
changeset
|
567 |
|
14348
6d0f64f7dedd
Cosmetics on Py_Get/SetRecursionLimit (for the style guide)
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents:
14333
diff
changeset
|
568 int |
|
6d0f64f7dedd
Cosmetics on Py_Get/SetRecursionLimit (for the style guide)
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents:
14333
diff
changeset
|
569 Py_GetRecursionLimit(void) |
|
14308
b8b3f76ffd51
add user-modifiable recursion_limit
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14268
diff
changeset
|
570 { |
|
b8b3f76ffd51
add user-modifiable recursion_limit
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14268
diff
changeset
|
571 return recursion_limit; |
|
b8b3f76ffd51
add user-modifiable recursion_limit
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14268
diff
changeset
|
572 } |
|
b8b3f76ffd51
add user-modifiable recursion_limit
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14268
diff
changeset
|
573 |
|
14348
6d0f64f7dedd
Cosmetics on Py_Get/SetRecursionLimit (for the style guide)
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents:
14333
diff
changeset
|
574 void |
|
6d0f64f7dedd
Cosmetics on Py_Get/SetRecursionLimit (for the style guide)
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents:
14333
diff
changeset
|
575 Py_SetRecursionLimit(int new_limit) |
|
14308
b8b3f76ffd51
add user-modifiable recursion_limit
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14268
diff
changeset
|
576 { |
|
b8b3f76ffd51
add user-modifiable recursion_limit
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14268
diff
changeset
|
577 recursion_limit = new_limit; |
|
43410
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
578 _Py_CheckRecursionLimit = recursion_limit; |
|
14308
b8b3f76ffd51
add user-modifiable recursion_limit
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14268
diff
changeset
|
579 } |
|
b8b3f76ffd51
add user-modifiable recursion_limit
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
14268
diff
changeset
|
580 |
|
30801
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
581 /* the macro Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall() |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
582 if the recursion_depth reaches _Py_CheckRecursionLimit. |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
583 If USE_STACKCHECK, the macro decrements _Py_CheckRecursionLimit |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
584 to guarantee that _Py_CheckRecursiveCall() is regularly called. |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
585 Without USE_STACKCHECK, there is no need for this. */ |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
586 int |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
587 _Py_CheckRecursiveCall(char *where) |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
588 { |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
589 PyThreadState *tstate = PyThreadState_GET(); |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
590 |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
591 #ifdef USE_STACKCHECK |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
592 if (PyOS_CheckStack()) { |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
593 --tstate->recursion_depth; |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
594 PyErr_SetString(PyExc_MemoryError, "Stack overflow"); |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
595 return -1; |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
596 } |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
597 #endif |
|
48986
22ab106e3186
Issue #3697: "Fatal Python error: Cannot recover from stack overflow"
Antoine Pitrou <solipsis@pitrou.net>
parents:
48887
diff
changeset
|
598 _Py_CheckRecursionLimit = recursion_limit; |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41969
diff
changeset
|
599 if (tstate->recursion_critical) |
|
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41969
diff
changeset
|
600 /* Somebody asked that we don't check for recursion. */ |
|
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41969
diff
changeset
|
601 return 0; |
|
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41969
diff
changeset
|
602 if (tstate->overflowed) { |
|
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41969
diff
changeset
|
603 if (tstate->recursion_depth > recursion_limit + 50) { |
|
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41969
diff
changeset
|
604 /* Overflowing while handling an overflow. Give up. */ |
|
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41969
diff
changeset
|
605 Py_FatalError("Cannot recover from stack overflow."); |
|
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41969
diff
changeset
|
606 } |
|
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41969
diff
changeset
|
607 return 0; |
|
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41969
diff
changeset
|
608 } |
|
30801
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
609 if (tstate->recursion_depth > recursion_limit) { |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
610 --tstate->recursion_depth; |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41969
diff
changeset
|
611 tstate->overflowed = 1; |
|
30801
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
612 PyErr_Format(PyExc_RuntimeError, |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
613 "maximum recursion depth exceeded%s", |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
614 where); |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
615 return -1; |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
616 } |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
617 return 0; |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
618 } |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
619 |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
620 /* 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
|
621 enum why_code { |
|
1fb2313ac3ce
Simplify previous checkin (bitfields for WHY codes).
Raymond Hettinger <python@rcn.com>
parents:
31874
diff
changeset
|
622 WHY_NOT = 0x0001, /* No error */ |
|
1fb2313ac3ce
Simplify previous checkin (bitfields for WHY codes).
Raymond Hettinger <python@rcn.com>
parents:
31874
diff
changeset
|
623 WHY_EXCEPTION = 0x0002, /* Exception occurred */ |
|
1fb2313ac3ce
Simplify previous checkin (bitfields for WHY codes).
Raymond Hettinger <python@rcn.com>
parents:
31874
diff
changeset
|
624 WHY_RERAISE = 0x0004, /* Exception re-raised by 'finally' */ |
|
1fb2313ac3ce
Simplify previous checkin (bitfields for WHY codes).
Raymond Hettinger <python@rcn.com>
parents:
31874
diff
changeset
|
625 WHY_RETURN = 0x0008, /* 'return' statement */ |
|
1fb2313ac3ce
Simplify previous checkin (bitfields for WHY codes).
Raymond Hettinger <python@rcn.com>
parents:
31874
diff
changeset
|
626 WHY_BREAK = 0x0010, /* 'break' statement */ |
|
1fb2313ac3ce
Simplify previous checkin (bitfields for WHY codes).
Raymond Hettinger <python@rcn.com>
parents:
31874
diff
changeset
|
627 WHY_CONTINUE = 0x0020, /* 'continue' statement */ |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
628 WHY_YIELD = 0x0040, /* 'yield' operator */ |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
629 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
|
630 }; |
|
1fb2313ac3ce
Simplify previous checkin (bitfields for WHY codes).
Raymond Hettinger <python@rcn.com>
parents:
31874
diff
changeset
|
631 |
|
43102
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
632 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
|
633 static int unpack_iterable(PyObject *, int, int, PyObject **); |
| 5018 | 634 |
|
50045
ba8fe3a40a5b
Merged revisions 67494 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
48986
diff
changeset
|
635 /* 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
|
636 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
|
637 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
|
638 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
|
639 fast_next_opcode*/ |
|
ba8fe3a40a5b
Merged revisions 67494 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
48986
diff
changeset
|
640 static int _Py_TracingPossible = 0; |
|
ba8fe3a40a5b
Merged revisions 67494 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
48986
diff
changeset
|
641 |
|
25108
3a26e352f0a6
replace thread state objects' ticker and checkinterval fields with two
Skip Montanaro <skip@pobox.com>
parents:
25078
diff
changeset
|
642 /* for manipulating the thread switch and periodic "stuff" - used to be |
|
3a26e352f0a6
replace thread state objects' ticker and checkinterval fields with two
Skip Montanaro <skip@pobox.com>
parents:
25078
diff
changeset
|
643 per thread, now just a pair o' globals */ |
|
25109
00b6dd414b80
Bump default check interval to 100 instructions. Computers are much faster
Skip Montanaro <skip@pobox.com>
parents:
25108
diff
changeset
|
644 int _Py_CheckInterval = 100; |
|
50839
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
645 volatile int _Py_Ticker = 0; /* so that we hit a "tick" first thing */ |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
646 |
| 5368 | 647 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
648 PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals) |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
649 { |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18611
diff
changeset
|
650 return PyEval_EvalCodeEx(co, |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
651 globals, locals, |
| 5368 | 652 (PyObject **)NULL, 0, |
| 653 (PyObject **)NULL, 0, | |
|
16257
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16017
diff
changeset
|
654 (PyObject **)NULL, 0, |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
655 NULL, NULL); |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
656 } |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
657 |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
658 |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
659 /* Interpreter main loop */ |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
660 |
|
32421
485d2ef43419
Patch #966493: Cleanup generator/eval_frame exposure.
Martin v. Löwis <martin@v.loewis.de>
parents:
32412
diff
changeset
|
661 PyObject * |
|
35298
b2fe5f8fcfdd
PEP 342 implementation. Per Guido's comments, the generator throw()
Phillip J. Eby <pje@telecommunity.com>
parents:
35126
diff
changeset
|
662 PyEval_EvalFrame(PyFrameObject *f) { |
|
b2fe5f8fcfdd
PEP 342 implementation. Per Guido's comments, the generator throw()
Phillip J. Eby <pje@telecommunity.com>
parents:
35126
diff
changeset
|
663 /* This is for backward compatibility with extension modules that |
|
43418
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
664 used this API; core interpreter code should call |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
665 PyEval_EvalFrameEx() */ |
|
35298
b2fe5f8fcfdd
PEP 342 implementation. Per Guido's comments, the generator throw()
Phillip J. Eby <pje@telecommunity.com>
parents:
35126
diff
changeset
|
666 return PyEval_EvalFrameEx(f, 0); |
|
b2fe5f8fcfdd
PEP 342 implementation. Per Guido's comments, the generator throw()
Phillip J. Eby <pje@telecommunity.com>
parents:
35126
diff
changeset
|
667 } |
|
b2fe5f8fcfdd
PEP 342 implementation. Per Guido's comments, the generator throw()
Phillip J. Eby <pje@telecommunity.com>
parents:
35126
diff
changeset
|
668 |
|
b2fe5f8fcfdd
PEP 342 implementation. Per Guido's comments, the generator throw()
Phillip J. Eby <pje@telecommunity.com>
parents:
35126
diff
changeset
|
669 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
|
670 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
|
671 { |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
672 #ifdef DXPAIRS |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
673 int lastopcode = 0; |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
674 #endif |
|
43418
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
675 register PyObject **stack_pointer; /* Next free slot in value stack */ |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
676 register unsigned char *next_instr; |
|
32359
e5bc947c44ca
Performance tweak: allow stack_pointer and oparg to be register variables.
Armin Rigo <arigo@tunes.org>
parents:
32301
diff
changeset
|
677 register int opcode; /* Current opcode */ |
|
e5bc947c44ca
Performance tweak: allow stack_pointer and oparg to be register variables.
Armin Rigo <arigo@tunes.org>
parents:
32301
diff
changeset
|
678 register int oparg; /* Current opcode argument, if any */ |
|
31875
1fb2313ac3ce
Simplify previous checkin (bitfields for WHY codes).
Raymond Hettinger <python@rcn.com>
parents:
31874
diff
changeset
|
679 register enum why_code why; /* Reason for block stack unwind */ |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
680 register int err; /* Error status -- nonzero if error */ |
| 5368 | 681 register PyObject *x; /* Result object -- NULL if error */ |
| 682 register PyObject *v; /* Temporary objects popped off stack */ | |
| 683 register PyObject *w; | |
| 684 register PyObject *u; | |
| 685 register PyObject *t; | |
|
16355
e4420c2468f9
Remove f_closure slot of frameobject and use f_localsplus instead.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16257
diff
changeset
|
686 register PyObject **fastlocals, **freevars; |
|
9513
350f24180dcb
Whoops! One the "redundant" initializations removed by Vladimir in
Guido van Rossum <guido@python.org>
parents:
9490
diff
changeset
|
687 PyObject *retval = NULL; /* Return value */ |
|
9671
1d40bc25703a
Use PyThreadState_GET() macro.
Guido van Rossum <guido@python.org>
parents:
9591
diff
changeset
|
688 PyThreadState *tstate = PyThreadState_GET(); |
|
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
|
689 PyCodeObject *co; |
| 24844 | 690 |
|
31872
9f5fe6b23e59
Since the fast_yield branch target was introduced, it appears that most
Tim Peters <tim.peters@gmail.com>
parents:
31797
diff
changeset
|
691 /* when tracing we set things up so that |
| 24844 | 692 |
| 693 not (instr_lb <= current_bytecode_offset < instr_ub) | |
| 694 | |
|
31872
9f5fe6b23e59
Since the fast_yield branch target was introduced, it appears that most
Tim Peters <tim.peters@gmail.com>
parents:
31797
diff
changeset
|
695 is true when the line being executed has changed. The |
| 24844 | 696 initial values are such as to make this false the first |
| 697 time it is tested. */ | |
| 31768 | 698 int instr_ub = -1, instr_lb = 0, instr_prev = -1; |
| 24844 | 699 |
|
9293
0a67db47e1d0
Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents:
9203
diff
changeset
|
700 unsigned char *first_instr; |
|
24545
d2f41c8a81f0
small speedup for constant and name access
Skip Montanaro <skip@pobox.com>
parents:
24284
diff
changeset
|
701 PyObject *names; |
|
d2f41c8a81f0
small speedup for constant and name access
Skip Montanaro <skip@pobox.com>
parents:
24284
diff
changeset
|
702 PyObject *consts; |
|
35745
407c3dacbd7c
Fix some mods that got dropped from the AST merge
Neal Norwitz <nnorwitz@gmail.com>
parents:
35742
diff
changeset
|
703 #if defined(Py_DEBUG) || defined(LLTRACE) |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
704 /* Make it easier to find out where we are with a debugger */ |
|
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
|
705 char *filename; |
|
1016
a41e3ba5b47d
Add some debugging features if DEBUG defined
Guido van Rossum <guido@python.org>
parents:
974
diff
changeset
|
706 #endif |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
707 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
708 /* Computed GOTOs, or |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
709 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
|
710 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
|
711 (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
|
712 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
713 The traditional bytecode evaluation loop uses a "switch" statement, which |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
714 decent compilers will optimize as a single indirect branch instruction |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
715 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
|
716 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
|
717 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
|
718 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
|
719 several identical opcodes). |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
720 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
721 "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
|
722 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
|
723 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
|
724 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
|
725 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
|
726 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
|
727 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
728 A mispredicted branch on a modern CPU flushes the whole pipeline and |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
729 can cost several CPU cycles (depending on the pipeline depth), |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
730 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
|
731 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
|
732 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
733 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
|
734 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
|
735 CPU architecture. |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
736 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
737 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
|
738 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
|
739 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
740 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
741 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
|
742 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
|
743 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
|
744 -fno-crossjumping). |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
745 */ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
746 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
747 #if defined(USE_COMPUTED_GOTOS) && defined(DYNAMIC_EXECUTION_PROFILE) |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
748 #undef USE_COMPUTED_GOTOS |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
749 #endif |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
750 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
751 #ifdef USE_COMPUTED_GOTOS |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
752 /* 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
|
753 #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
|
754 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
755 /* 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
|
756 (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
|
757 #define TARGET_WITH_IMPL(op, impl) \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
758 TARGET_##op: \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
759 opcode = op; \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
760 if (HAS_ARG(op)) \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
761 oparg = NEXTARG(); \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
762 case op: \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
763 goto impl; \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
764 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
765 #define TARGET(op) \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
766 TARGET_##op: \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
767 opcode = op; \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
768 if (HAS_ARG(op)) \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
769 oparg = NEXTARG(); \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
770 case op: |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
771 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
772 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
773 #define DISPATCH() \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
774 { \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
775 /* Avoid multiple loads from _Py_Ticker despite `volatile` */ \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
776 int _tick = _Py_Ticker - 1; \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
777 _Py_Ticker = _tick; \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
778 if (_tick >= 0) { \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
779 FAST_DISPATCH(); \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
780 } \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
781 continue; \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
782 } |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
783 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
784 #ifdef LLTRACE |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
785 #define FAST_DISPATCH() \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
786 { \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
787 if (!lltrace && !_Py_TracingPossible) { \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
788 f->f_lasti = INSTR_OFFSET(); \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
789 goto *opcode_targets[*next_instr++]; \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
790 } \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
791 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
|
792 } |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
793 #else |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
794 #define FAST_DISPATCH() \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
795 { \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
796 if (!_Py_TracingPossible) { \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
797 f->f_lasti = INSTR_OFFSET(); \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
798 goto *opcode_targets[*next_instr++]; \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
799 } \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
800 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
|
801 } |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
802 #endif |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
803 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
804 #else |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
805 #define TARGET(op) \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
806 case op: |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
807 #define TARGET_WITH_IMPL(op, impl) \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
808 /* silence compiler warnings about `impl` unused */ \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
809 if (0) goto impl; \ |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
810 case op: |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
811 #define DISPATCH() continue |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
812 #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
|
813 #endif |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
814 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
815 |
|
24232
e06b1ab0bdb8
SF patch # 580411, move frame macros from frameobject.h into ceval.c
Neal Norwitz <nnorwitz@gmail.com>
parents:
24190
diff
changeset
|
816 /* 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
|
817 |
|
e06b1ab0bdb8
SF patch # 580411, move frame macros from frameobject.h into ceval.c
Neal Norwitz <nnorwitz@gmail.com>
parents:
24190
diff
changeset
|
818 #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
|
819 #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
|
820 #else |
|
e06b1ab0bdb8
SF patch # 580411, move frame macros from frameobject.h into ceval.c
Neal Norwitz <nnorwitz@gmail.com>
parents:
24190
diff
changeset
|
821 #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
|
822 #endif |
|
e06b1ab0bdb8
SF patch # 580411, move frame macros from frameobject.h into ceval.c
Neal Norwitz <nnorwitz@gmail.com>
parents:
24190
diff
changeset
|
823 |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
824 #ifdef WITH_TSC |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
825 /* 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
|
826 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
|
827 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
|
828 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
|
829 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
|
830 (may be skipped) |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
831 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
|
832 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
|
833 |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
834 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
|
835 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
|
836 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
|
837 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
|
838 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
|
839 |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
840 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
|
841 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
|
842 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
|
843 |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
844 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
|
845 cases: |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
846 |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
847 IMPORT_STAR |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
848 IMPORT_FROM |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
849 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
|
850 |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
851 */ |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
852 uint64 inst0, inst1, loop0, loop1, intr0 = 0, intr1 = 0; |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
853 int ticked = 0; |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
854 |
|
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
|
855 READ_TIMESTAMP(inst0); |
|
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
|
856 READ_TIMESTAMP(inst1); |
|
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
|
857 READ_TIMESTAMP(loop0); |
|
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
|
858 READ_TIMESTAMP(loop1); |
| 33104 | 859 |
| 860 /* shut up the compiler */ | |
| 861 opcode = 0; | |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
862 #endif |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
863 |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
864 /* Code access macros */ |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
865 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36475
diff
changeset
|
866 #define INSTR_OFFSET() ((int)(next_instr - first_instr)) |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
867 #define NEXTOP() (*next_instr++) |
|
31894
310dd98ea064
Revert 2.393, elimination of pre-decrementing, which
Raymond Hettinger <python@rcn.com>
parents:
31880
diff
changeset
|
868 #define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2]) |
|
32974
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
869 #define PEEKARG() ((next_instr[2]<<8) + next_instr[1]) |
|
9293
0a67db47e1d0
Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents:
9203
diff
changeset
|
870 #define JUMPTO(x) (next_instr = first_instr + (x)) |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
871 #define JUMPBY(x) (next_instr += (x)) |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
872 |
|
28302
8c082936daaf
Introduced macros for a simple opcode prediction protocol.
Raymond Hettinger <python@rcn.com>
parents:
28296
diff
changeset
|
873 /* OpCode prediction macros |
|
43418
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
874 Some opcodes tend to come in pairs thus making it possible to |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
875 predict the second code when the first is run. For example, |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
876 COMPARE_OP is often followed by JUMP_IF_FALSE or JUMP_IF_TRUE. And, |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
877 those opcodes are often followed by a POP_TOP. |
|
28302
8c082936daaf
Introduced macros for a simple opcode prediction protocol.
Raymond Hettinger <python@rcn.com>
parents:
28296
diff
changeset
|
878 |
|
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
|
879 Verifying the prediction costs a single high-speed test of a register |
|
28303
470504ef578b
Fix comment and whitespace.
Raymond Hettinger <python@rcn.com>
parents:
28302
diff
changeset
|
880 variable against a constant. If the pairing was good, then the |
|
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
|
881 processor's own internal branch predication has a high likelihood of |
|
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
|
882 success, resulting in a nearly zero-overhead transition to the |
|
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
|
883 next opcode. A successful prediction saves a trip through the eval-loop |
|
48574
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
884 including its two unpredictable branches, the HAS_ARG test and the |
|
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
|
885 switch-case. Combined with the processor's internal branch prediction, |
|
48574
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
886 a successful PREDICT has the effect of making the two opcodes run as if |
|
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
|
887 they were a single new opcode with the bodies combined. |
|
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
|
888 |
|
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
|
889 If collecting opcode statistics, your choices are to either keep the |
|
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
|
890 predictions turned-on and interpret the results as if some opcodes |
|
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
|
891 had been combined or turn-off predictions so that the opcode frequency |
|
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
|
892 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
|
893 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
894 Opcode prediction is disabled with threaded code, since the latter allows |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
895 the CPU to record separate branch prediction information for each |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
896 opcode. |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
897 |
|
28302
8c082936daaf
Introduced macros for a simple opcode prediction protocol.
Raymond Hettinger <python@rcn.com>
parents:
28296
diff
changeset
|
898 */ |
|
8c082936daaf
Introduced macros for a simple opcode prediction protocol.
Raymond Hettinger <python@rcn.com>
parents:
28296
diff
changeset
|
899 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
900 #if defined(DYNAMIC_EXECUTION_PROFILE) || defined(USE_COMPUTED_GOTOS) |
|
31487
f57f5ce22c8d
SF patch #884022: dynamic execution profiling vs opcode prediction
Raymond Hettinger <python@rcn.com>
parents:
31462
diff
changeset
|
901 #define PREDICT(op) if (0) goto PRED_##op |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
902 #define PREDICTED(op) PRED_##op: |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
903 #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
|
904 #else |
|
28303
470504ef578b
Fix comment and whitespace.
Raymond Hettinger <python@rcn.com>
parents:
28302
diff
changeset
|
905 #define PREDICT(op) if (*next_instr == op) goto PRED_##op |
|
28302
8c082936daaf
Introduced macros for a simple opcode prediction protocol.
Raymond Hettinger <python@rcn.com>
parents:
28296
diff
changeset
|
906 #define PREDICTED(op) PRED_##op: next_instr++ |
|
32974
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
907 #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
|
908 #endif |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
909 |
|
28302
8c082936daaf
Introduced macros for a simple opcode prediction protocol.
Raymond Hettinger <python@rcn.com>
parents:
28296
diff
changeset
|
910 |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
911 /* Stack manipulation macros */ |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
912 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36475
diff
changeset
|
913 /* 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
|
914 co_stacksize are ints. */ |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36475
diff
changeset
|
915 #define STACK_LEVEL() ((int)(stack_pointer - f->f_valuestack)) |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
916 #define EMPTY() (STACK_LEVEL() == 0) |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
917 #define TOP() (stack_pointer[-1]) |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
918 #define SECOND() (stack_pointer[-2]) |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
919 #define THIRD() (stack_pointer[-3]) |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
920 #define FOURTH() (stack_pointer[-4]) |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
921 #define SET_TOP(v) (stack_pointer[-1] = (v)) |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
922 #define SET_SECOND(v) (stack_pointer[-2] = (v)) |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
923 #define SET_THIRD(v) (stack_pointer[-3] = (v)) |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
924 #define SET_FOURTH(v) (stack_pointer[-4] = (v)) |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
925 #define BASIC_STACKADJ(n) (stack_pointer += n) |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
926 #define BASIC_PUSH(v) (*stack_pointer++ = (v)) |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
927 #define BASIC_POP() (*--stack_pointer) |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
928 |
| 567 | 929 #ifdef LLTRACE |
|
20492
bf4ff05eab52
For debug build, check that the stack pointer never exceeds the stack size.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20438
diff
changeset
|
930 #define PUSH(v) { (void)(BASIC_PUSH(v), \ |
|
bf4ff05eab52
For debug build, check that the stack pointer never exceeds the stack size.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20438
diff
changeset
|
931 lltrace && prtrace(TOP(), "push")); \ |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
932 assert(STACK_LEVEL() <= co->co_stacksize); } |
|
43418
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
933 #define POP() ((void)(lltrace && prtrace(TOP(), "pop")), \ |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
934 BASIC_POP()) |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
935 #define STACKADJ(n) { (void)(BASIC_STACKADJ(n), \ |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
936 lltrace && prtrace(TOP(), "stackadj")); \ |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
937 assert(STACK_LEVEL() <= co->co_stacksize); } |
|
44310
e70acbf26cda
Merged revisions 59488-59511 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44187
diff
changeset
|
938 #define EXT_POP(STACK_POINTER) ((void)(lltrace && \ |
|
e70acbf26cda
Merged revisions 59488-59511 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44187
diff
changeset
|
939 prtrace((STACK_POINTER)[-1], "ext_pop")), \ |
|
e70acbf26cda
Merged revisions 59488-59511 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44187
diff
changeset
|
940 *--(STACK_POINTER)) |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
941 #else |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
942 #define PUSH(v) BASIC_PUSH(v) |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
943 #define POP() BASIC_POP() |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
944 #define STACKADJ(n) BASIC_STACKADJ(n) |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36580
diff
changeset
|
945 #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
|
946 #endif |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
947 |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
948 /* Local variable macros */ |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
949 |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
950 #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
|
951 |
|
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
|
952 /* 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
|
953 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
|
954 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
|
955 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
|
956 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
|
957 variable would be pointing to already-freed memory. */ |
|
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
|
958 #define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \ |
|
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
|
959 GETLOCAL(i) = 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
|
960 Py_XDECREF(tmp); } while (0) |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
961 |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
962 |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
963 #define UNWIND_BLOCK(b) \ |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
964 while (STACK_LEVEL() > (b)->b_level) { \ |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
965 PyObject *v = POP(); \ |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
966 Py_XDECREF(v); \ |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
967 } |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
968 |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
969 #define UNWIND_EXCEPT_HANDLER(b) \ |
|
47729
ee2823e1f23b
improvements to the fix for #3114
Benjamin Peterson <benjamin@python.org>
parents:
47724
diff
changeset
|
970 { \ |
|
ee2823e1f23b
improvements to the fix for #3114
Benjamin Peterson <benjamin@python.org>
parents:
47724
diff
changeset
|
971 PyObject *type, *value, *traceback; \ |
|
ee2823e1f23b
improvements to the fix for #3114
Benjamin Peterson <benjamin@python.org>
parents:
47724
diff
changeset
|
972 assert(STACK_LEVEL() >= (b)->b_level + 3); \ |
|
ee2823e1f23b
improvements to the fix for #3114
Benjamin Peterson <benjamin@python.org>
parents:
47724
diff
changeset
|
973 while (STACK_LEVEL() > (b)->b_level + 3) { \ |
|
ee2823e1f23b
improvements to the fix for #3114
Benjamin Peterson <benjamin@python.org>
parents:
47724
diff
changeset
|
974 value = POP(); \ |
|
ee2823e1f23b
improvements to the fix for #3114
Benjamin Peterson <benjamin@python.org>
parents:
47724
diff
changeset
|
975 Py_XDECREF(value); \ |
|
ee2823e1f23b
improvements to the fix for #3114
Benjamin Peterson <benjamin@python.org>
parents:
47724
diff
changeset
|
976 } \ |
|
ee2823e1f23b
improvements to the fix for #3114
Benjamin Peterson <benjamin@python.org>
parents:
47724
diff
changeset
|
977 type = tstate->exc_type; \ |
|
ee2823e1f23b
improvements to the fix for #3114
Benjamin Peterson <benjamin@python.org>
parents:
47724
diff
changeset
|
978 value = tstate->exc_value; \ |
|
ee2823e1f23b
improvements to the fix for #3114
Benjamin Peterson <benjamin@python.org>
parents:
47724
diff
changeset
|
979 traceback = tstate->exc_traceback; \ |
|
ee2823e1f23b
improvements to the fix for #3114
Benjamin Peterson <benjamin@python.org>
parents:
47724
diff
changeset
|
980 tstate->exc_type = POP(); \ |
|
ee2823e1f23b
improvements to the fix for #3114
Benjamin Peterson <benjamin@python.org>
parents:
47724
diff
changeset
|
981 tstate->exc_value = POP(); \ |
|
ee2823e1f23b
improvements to the fix for #3114
Benjamin Peterson <benjamin@python.org>
parents:
47724
diff
changeset
|
982 tstate->exc_traceback = POP(); \ |
|
ee2823e1f23b
improvements to the fix for #3114
Benjamin Peterson <benjamin@python.org>
parents:
47724
diff
changeset
|
983 Py_XDECREF(type); \ |
|
ee2823e1f23b
improvements to the fix for #3114
Benjamin Peterson <benjamin@python.org>
parents:
47724
diff
changeset
|
984 Py_XDECREF(value); \ |
|
ee2823e1f23b
improvements to the fix for #3114
Benjamin Peterson <benjamin@python.org>
parents:
47724
diff
changeset
|
985 Py_XDECREF(traceback); \ |
|
ee2823e1f23b
improvements to the fix for #3114
Benjamin Peterson <benjamin@python.org>
parents:
47724
diff
changeset
|
986 } |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
987 |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
988 #define SAVE_EXC_STATE() \ |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
989 { \ |
|
47729
ee2823e1f23b
improvements to the fix for #3114
Benjamin Peterson <benjamin@python.org>
parents:
47724
diff
changeset
|
990 PyObject *type, *value, *traceback; \ |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
991 Py_XINCREF(tstate->exc_type); \ |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
992 Py_XINCREF(tstate->exc_value); \ |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
993 Py_XINCREF(tstate->exc_traceback); \ |
|
47729
ee2823e1f23b
improvements to the fix for #3114
Benjamin Peterson <benjamin@python.org>
parents:
47724
diff
changeset
|
994 type = f->f_exc_type; \ |
|
ee2823e1f23b
improvements to the fix for #3114
Benjamin Peterson <benjamin@python.org>
parents:
47724
diff
changeset
|
995 value = f->f_exc_value; \ |
|
ee2823e1f23b
improvements to the fix for #3114
Benjamin Peterson <benjamin@python.org>
parents:
47724
diff
changeset
|
996 traceback = f->f_exc_traceback; \ |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
997 f->f_exc_type = tstate->exc_type; \ |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
998 f->f_exc_value = tstate->exc_value; \ |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
999 f->f_exc_traceback = tstate->exc_traceback; \ |
|
47729
ee2823e1f23b
improvements to the fix for #3114
Benjamin Peterson <benjamin@python.org>
parents:
47724
diff
changeset
|
1000 Py_XDECREF(type); \ |
|
ee2823e1f23b
improvements to the fix for #3114
Benjamin Peterson <benjamin@python.org>
parents:
47724
diff
changeset
|
1001 Py_XDECREF(value); \ |
|
ee2823e1f23b
improvements to the fix for #3114
Benjamin Peterson <benjamin@python.org>
parents:
47724
diff
changeset
|
1002 Py_XDECREF(traceback); \ |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1003 } |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1004 |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1005 #define SWAP_EXC_STATE() \ |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1006 { \ |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1007 PyObject *tmp; \ |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1008 tmp = tstate->exc_type; \ |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1009 tstate->exc_type = f->f_exc_type; \ |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1010 f->f_exc_type = tmp; \ |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1011 tmp = tstate->exc_value; \ |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1012 tstate->exc_value = f->f_exc_value; \ |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1013 f->f_exc_value = tmp; \ |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1014 tmp = tstate->exc_traceback; \ |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1015 tstate->exc_traceback = f->f_exc_traceback; \ |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1016 f->f_exc_traceback = tmp; \ |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1017 } |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1018 |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5368
diff
changeset
|
1019 /* Start of code */ |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5368
diff
changeset
|
1020 |
|
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
|
1021 if (f == NULL) |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
1022 return NULL; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
1023 |
|
30801
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
1024 /* push frame */ |
|
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
1025 if (Py_EnterRecursiveCall("")) |
|
30782
f51dc9026e4d
oh dear. Wrong manipulation. Committed a version of ceval.c from my
Armin Rigo <arigo@tunes.org>
parents:
30781
diff
changeset
|
1026 return NULL; |
|
3839
22e29b1747e1
Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents:
3694
diff
changeset
|
1027 |
|
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
|
1028 tstate->frame = f; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
1029 |
|
19692
04218e85b156
Move call_trace(..., PyTrace_CALL, ...) call to top of eval_frame. That
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19611
diff
changeset
|
1030 if (tstate->use_tracing) { |
|
04218e85b156
Move call_trace(..., PyTrace_CALL, ...) call to top of eval_frame. That
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19611
diff
changeset
|
1031 if (tstate->c_tracefunc != NULL) { |
|
04218e85b156
Move call_trace(..., PyTrace_CALL, ...) call to top of eval_frame. That
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19611
diff
changeset
|
1032 /* tstate->c_tracefunc, if defined, is a |
|
04218e85b156
Move call_trace(..., PyTrace_CALL, ...) call to top of eval_frame. That
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19611
diff
changeset
|
1033 function that will be called on *every* entry |
|
04218e85b156
Move call_trace(..., PyTrace_CALL, ...) call to top of eval_frame. That
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19611
diff
changeset
|
1034 to a code block. Its return value, if not |
|
04218e85b156
Move call_trace(..., PyTrace_CALL, ...) call to top of eval_frame. That
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19611
diff
changeset
|
1035 None, is a function that will be called at |
|
04218e85b156
Move call_trace(..., PyTrace_CALL, ...) call to top of eval_frame. That
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19611
diff
changeset
|
1036 the start of each executed line of code. |
|
04218e85b156
Move call_trace(..., PyTrace_CALL, ...) call to top of eval_frame. That
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19611
diff
changeset
|
1037 (Actually, the function must return itself |
|
04218e85b156
Move call_trace(..., PyTrace_CALL, ...) call to top of eval_frame. That
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19611
diff
changeset
|
1038 in order to continue tracing.) The trace |
|
04218e85b156
Move call_trace(..., PyTrace_CALL, ...) call to top of eval_frame. That
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19611
diff
changeset
|
1039 functions are called with three arguments: |
|
04218e85b156
Move call_trace(..., PyTrace_CALL, ...) call to top of eval_frame. That
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19611
diff
changeset
|
1040 a pointer to the current frame, a string |
|
04218e85b156
Move call_trace(..., PyTrace_CALL, ...) call to top of eval_frame. That
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19611
diff
changeset
|
1041 indicating why the function is called, and |
|
04218e85b156
Move call_trace(..., PyTrace_CALL, ...) call to top of eval_frame. That
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19611
diff
changeset
|
1042 an argument which depends on the situation. |
|
04218e85b156
Move call_trace(..., PyTrace_CALL, ...) call to top of eval_frame. That
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19611
diff
changeset
|
1043 The global trace function is also called |
|
04218e85b156
Move call_trace(..., PyTrace_CALL, ...) call to top of eval_frame. That
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19611
diff
changeset
|
1044 whenever an exception is detected. */ |
|
48574
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
1045 if (call_trace_protected(tstate->c_tracefunc, |
|
43840
73c8e27eb9ce
Correction for issue1265 (pdb bug with "with" statement).
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
43815
diff
changeset
|
1046 tstate->c_traceobj, |
|
73c8e27eb9ce
Correction for issue1265 (pdb bug with "with" statement).
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
43815
diff
changeset
|
1047 f, PyTrace_CALL, Py_None)) { |
|
19692
04218e85b156
Move call_trace(..., PyTrace_CALL, ...) call to top of eval_frame. That
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19611
diff
changeset
|
1048 /* Trace function raised an error */ |
|
30801
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
1049 goto exit_eval_frame; |
|
19692
04218e85b156
Move call_trace(..., PyTrace_CALL, ...) call to top of eval_frame. That
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19611
diff
changeset
|
1050 } |
|
04218e85b156
Move call_trace(..., PyTrace_CALL, ...) call to top of eval_frame. That
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19611
diff
changeset
|
1051 } |
|
04218e85b156
Move call_trace(..., PyTrace_CALL, ...) call to top of eval_frame. That
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19611
diff
changeset
|
1052 if (tstate->c_profilefunc != NULL) { |
|
04218e85b156
Move call_trace(..., PyTrace_CALL, ...) call to top of eval_frame. That
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19611
diff
changeset
|
1053 /* Similar for c_profilefunc, except it needn't |
|
04218e85b156
Move call_trace(..., PyTrace_CALL, ...) call to top of eval_frame. That
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19611
diff
changeset
|
1054 return itself and isn't called for "line" events */ |
|
43840
73c8e27eb9ce
Correction for issue1265 (pdb bug with "with" statement).
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
43815
diff
changeset
|
1055 if (call_trace_protected(tstate->c_profilefunc, |
|
73c8e27eb9ce
Correction for issue1265 (pdb bug with "with" statement).
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
43815
diff
changeset
|
1056 tstate->c_profileobj, |
|
73c8e27eb9ce
Correction for issue1265 (pdb bug with "with" statement).
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
43815
diff
changeset
|
1057 f, PyTrace_CALL, Py_None)) { |
|
19692
04218e85b156
Move call_trace(..., PyTrace_CALL, ...) call to top of eval_frame. That
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19611
diff
changeset
|
1058 /* Profile function raised an error */ |
|
30801
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
1059 goto exit_eval_frame; |
|
19692
04218e85b156
Move call_trace(..., PyTrace_CALL, ...) call to top of eval_frame. That
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19611
diff
changeset
|
1060 } |
|
04218e85b156
Move call_trace(..., PyTrace_CALL, ...) call to top of eval_frame. That
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19611
diff
changeset
|
1061 } |
|
04218e85b156
Move call_trace(..., PyTrace_CALL, ...) call to top of eval_frame. That
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19611
diff
changeset
|
1062 } |
|
04218e85b156
Move call_trace(..., PyTrace_CALL, ...) call to top of eval_frame. That
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19611
diff
changeset
|
1063 |
|
26109
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
26079
diff
changeset
|
1064 co = f->f_code; |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
26079
diff
changeset
|
1065 names = co->co_names; |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
26079
diff
changeset
|
1066 consts = co->co_consts; |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
26079
diff
changeset
|
1067 fastlocals = f->f_localsplus; |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
1068 freevars = f->f_localsplus + co->co_nlocals; |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
46725
diff
changeset
|
1069 first_instr = (unsigned char*) PyBytes_AS_STRING(co->co_code); |
|
26109
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
26079
diff
changeset
|
1070 /* An explanation is in order for the next line. |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
26079
diff
changeset
|
1071 |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
26079
diff
changeset
|
1072 f->f_lasti now refers to the index of the last instruction |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
26079
diff
changeset
|
1073 executed. You might think this was obvious from the name, but |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
26079
diff
changeset
|
1074 this wasn't always true before 2.3! PyFrame_New now sets |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
26079
diff
changeset
|
1075 f->f_lasti to -1 (i.e. the index *before* the first instruction) |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
26079
diff
changeset
|
1076 and YIELD_VALUE doesn't fiddle with f_lasti any more. So this |
|
48574
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
1077 does work. Promise. |
|
40582
67287ca4e1e8
Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40529
diff
changeset
|
1078 |
|
67287ca4e1e8
Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40529
diff
changeset
|
1079 When the PREDICT() macros are enabled, some opcode pairs follow in |
|
48574
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
1080 direct succession without updating f->f_lasti. A successful |
|
40582
67287ca4e1e8
Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40529
diff
changeset
|
1081 prediction effectively links the two codes together as if they |
|
67287ca4e1e8
Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40529
diff
changeset
|
1082 were a single new opcode; accordingly,f->f_lasti will point to |
|
67287ca4e1e8
Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40529
diff
changeset
|
1083 the first code in the pair (for instance, GET_ITER followed by |
|
67287ca4e1e8
Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40529
diff
changeset
|
1084 FOR_ITER is effectively a single opcode and f->f_lasti will point |
|
67287ca4e1e8
Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40529
diff
changeset
|
1085 at to the beginning of the combined pair.) |
|
67287ca4e1e8
Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40529
diff
changeset
|
1086 */ |
|
26109
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
26079
diff
changeset
|
1087 next_instr = first_instr + f->f_lasti + 1; |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
26079
diff
changeset
|
1088 stack_pointer = f->f_stacktop; |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
26079
diff
changeset
|
1089 assert(stack_pointer != NULL); |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
26079
diff
changeset
|
1090 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */ |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
26079
diff
changeset
|
1091 |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1092 if (f->f_code->co_flags & CO_GENERATOR) { |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1093 if (f->f_exc_type != NULL && f->f_exc_type != Py_None) { |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1094 /* We were in an except handler when we left, |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1095 restore the exception state which was put aside |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1096 (see YIELD_VALUE). */ |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1097 SWAP_EXC_STATE(); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1098 } |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1099 else { |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1100 SAVE_EXC_STATE(); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1101 } |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1102 } |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1103 |
|
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
|
1104 #ifdef LLTRACE |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35609
diff
changeset
|
1105 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
|
1106 #endif |
|
35745
407c3dacbd7c
Fix some mods that got dropped from the AST merge
Neal Norwitz <nnorwitz@gmail.com>
parents:
35742
diff
changeset
|
1107 #if defined(Py_DEBUG) || defined(LLTRACE) |
|
48660
85b67fb5672b
Rename PyUnicode_AsString -> _PyUnicode_AsString and
Marc-André Lemburg <mal@egenix.com>
parents:
48574
diff
changeset
|
1108 filename = _PyUnicode_AsString(co->co_filename); |
|
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
|
1109 #endif |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1110 |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1111 why = WHY_NOT; |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1112 err = 0; |
| 5368 | 1113 x = Py_None; /* Not a reference, just anything non-NULL */ |
|
15152
ed49a67869e9
Remove the last gcc -Wall warning about possible use of an uninitialized
Fred Drake <fdrake@acm.org>
parents:
15151
diff
changeset
|
1114 w = NULL; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1115 |
|
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
|
1116 if (throwflag) { /* support for generator.throw() */ |
|
35298
b2fe5f8fcfdd
PEP 342 implementation. Per Guido's comments, the generator throw()
Phillip J. Eby <pje@telecommunity.com>
parents:
35126
diff
changeset
|
1117 why = WHY_EXCEPTION; |
|
b2fe5f8fcfdd
PEP 342 implementation. Per Guido's comments, the generator throw()
Phillip J. Eby <pje@telecommunity.com>
parents:
35126
diff
changeset
|
1118 goto on_error; |
|
b2fe5f8fcfdd
PEP 342 implementation. Per Guido's comments, the generator throw()
Phillip J. Eby <pje@telecommunity.com>
parents:
35126
diff
changeset
|
1119 } |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
1120 |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1121 for (;;) { |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
1122 #ifdef WITH_TSC |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
1123 if (inst1 == 0) { |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
1124 /* Almost surely, the opcode executed a break |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
1125 or a continue, preventing inst1 from being set |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
1126 on the way out of the loop. |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
1127 */ |
|
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
|
1128 READ_TIMESTAMP(inst1); |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
1129 loop1 = inst1; |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
1130 } |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
1131 dump_tsc(opcode, ticked, inst0, inst1, loop0, loop1, |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
1132 intr0, intr1); |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
1133 ticked = 0; |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
1134 inst1 = 0; |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
1135 intr0 = 0; |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
1136 intr1 = 0; |
|
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
|
1137 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
|
1138 #endif |
| 24844 | 1139 assert(stack_pointer >= f->f_valuestack); /* else underflow */ |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
1140 assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */ |
| 24844 | 1141 |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5368
diff
changeset
|
1142 /* Do periodic things. Doing this every time through |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5368
diff
changeset
|
1143 the loop would add too much overhead, so we do it |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5368
diff
changeset
|
1144 only every Nth instruction. We also do it if |
|
50839
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
1145 ``pendingcalls_to_do'' is set, i.e. when an asynchronous |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5368
diff
changeset
|
1146 event needs attention (e.g. a signal handler or |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5368
diff
changeset
|
1147 async I/O handler); see Py_AddPendingCall() and |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5368
diff
changeset
|
1148 Py_MakePendingCalls() above. */ |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1149 |
|
25108
3a26e352f0a6
replace thread state objects' ticker and checkinterval fields with two
Skip Montanaro <skip@pobox.com>
parents:
25078
diff
changeset
|
1150 if (--_Py_Ticker < 0) { |
|
43410
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
1151 if (*next_instr == SETUP_FINALLY) { |
|
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
1152 /* Make the last opcode before |
|
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
1153 a try: finally: block uninterruptable. */ |
|
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
1154 goto fast_next_opcode; |
|
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
1155 } |
|
25108
3a26e352f0a6
replace thread state objects' ticker and checkinterval fields with two
Skip Montanaro <skip@pobox.com>
parents:
25078
diff
changeset
|
1156 _Py_Ticker = _Py_CheckInterval; |
|
26109
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
26079
diff
changeset
|
1157 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
|
1158 #ifdef WITH_TSC |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
1159 ticked = 1; |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
1160 #endif |
|
50839
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
1161 if (pendingcalls_to_do) { |
|
3839
22e29b1747e1
Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents:
3694
diff
changeset
|
1162 if (Py_MakePendingCalls() < 0) { |
|
22e29b1747e1
Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents:
3694
diff
changeset
|
1163 why = WHY_EXCEPTION; |
|
22e29b1747e1
Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents:
3694
diff
changeset
|
1164 goto on_error; |
|
22e29b1747e1
Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents:
3694
diff
changeset
|
1165 } |
|
50839
75009d4863c9
Merged revisions 68460 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50211
diff
changeset
|
1166 if (pendingcalls_to_do) |
|
34020
be370abb020f
Hye-Shik Chang's fix for Bug 875692.
Kurt B. Kaiser <kbk@shore.net>
parents:
33715
diff
changeset
|
1167 /* MakePendingCalls() didn't succeed. |
|
be370abb020f
Hye-Shik Chang's fix for Bug 875692.
Kurt B. Kaiser <kbk@shore.net>
parents:
33715
diff
changeset
|
1168 Force early re-execution of this |
|
be370abb020f
Hye-Shik Chang's fix for Bug 875692.
Kurt B. Kaiser <kbk@shore.net>
parents:
33715
diff
changeset
|
1169 "periodic" code, possibly after |
|
be370abb020f
Hye-Shik Chang's fix for Bug 875692.
Kurt B. Kaiser <kbk@shore.net>
parents:
33715
diff
changeset
|
1170 a thread switch */ |
|
be370abb020f
Hye-Shik Chang's fix for Bug 875692.
Kurt B. Kaiser <kbk@shore.net>
parents:
33715
diff
changeset
|
1171 _Py_Ticker = 0; |
|
3839
22e29b1747e1
Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents:
3694
diff
changeset
|
1172 } |
|
1846
5243fb187d36
call_object: print message before abort()
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
1173 #ifdef WITH_THREAD |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
1174 if (interpreter_lock) { |
|
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
1175 /* Give another thread a chance */ |
|
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
1176 |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5911
diff
changeset
|
1177 if (PyThreadState_Swap(NULL) != tstate) |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5911
diff
changeset
|
1178 Py_FatalError("ceval: tstate mix-up"); |
|
9679
877d23bd5bdc
Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents:
9671
diff
changeset
|
1179 PyThread_release_lock(interpreter_lock); |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
1180 |
|
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
1181 /* Other threads may run now */ |
|
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
1182 |
|
9679
877d23bd5bdc
Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents:
9671
diff
changeset
|
1183 PyThread_acquire_lock(interpreter_lock, 1); |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5911
diff
changeset
|
1184 if (PyThreadState_Swap(tstate) != NULL) |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5911
diff
changeset
|
1185 Py_FatalError("ceval: orphan tstate"); |
|
29643
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
29349
diff
changeset
|
1186 |
|
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
29349
diff
changeset
|
1187 /* Check for thread interrupts */ |
|
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
29349
diff
changeset
|
1188 |
|
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
29349
diff
changeset
|
1189 if (tstate->async_exc != NULL) { |
|
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
29349
diff
changeset
|
1190 x = tstate->async_exc; |
|
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
29349
diff
changeset
|
1191 tstate->async_exc = NULL; |
|
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
29349
diff
changeset
|
1192 PyErr_SetNone(x); |
|
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
29349
diff
changeset
|
1193 Py_DECREF(x); |
|
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
29349
diff
changeset
|
1194 why = WHY_EXCEPTION; |
|
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
29349
diff
changeset
|
1195 goto on_error; |
|
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
29349
diff
changeset
|
1196 } |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
1197 } |
|
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
1198 #endif |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1199 } |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
815
diff
changeset
|
1200 |
|
21974
052efc06520a
Move some opcodes to top of big eval_frame switch statement. Skip
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
21935
diff
changeset
|
1201 fast_next_opcode: |
|
26109
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
26079
diff
changeset
|
1202 f->f_lasti = INSTR_OFFSET(); |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
26079
diff
changeset
|
1203 |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
26079
diff
changeset
|
1204 /* line-by-line tracing support */ |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
26079
diff
changeset
|
1205 |
|
50045
ba8fe3a40a5b
Merged revisions 67494 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
48986
diff
changeset
|
1206 if (_Py_TracingPossible && |
|
ba8fe3a40a5b
Merged revisions 67494 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
48986
diff
changeset
|
1207 tstate->c_tracefunc != NULL && !tstate->tracing) { |
|
26109
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
26079
diff
changeset
|
1208 /* see maybe_call_line_trace |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
26079
diff
changeset
|
1209 for expository comments */ |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
26079
diff
changeset
|
1210 f->f_stacktop = stack_pointer; |
|
31872
9f5fe6b23e59
Since the fast_yield branch target was introduced, it appears that most
Tim Peters <tim.peters@gmail.com>
parents:
31797
diff
changeset
|
1211 |
|
28886
af53729d3cdd
Armin Rigo's fix & test for
Michael W. Hudson <mwh@python.net>
parents:
28759
diff
changeset
|
1212 err = maybe_call_line_trace(tstate->c_tracefunc, |
|
af53729d3cdd
Armin Rigo's fix & test for
Michael W. Hudson <mwh@python.net>
parents:
28759
diff
changeset
|
1213 tstate->c_traceobj, |
| 31768 | 1214 f, &instr_lb, &instr_ub, |
| 1215 &instr_prev); | |
|
28886
af53729d3cdd
Armin Rigo's fix & test for
Michael W. Hudson <mwh@python.net>
parents:
28759
diff
changeset
|
1216 /* Reload possibly changed frame fields */ |
|
af53729d3cdd
Armin Rigo's fix & test for
Michael W. Hudson <mwh@python.net>
parents:
28759
diff
changeset
|
1217 JUMPTO(f->f_lasti); |
|
af53729d3cdd
Armin Rigo's fix & test for
Michael W. Hudson <mwh@python.net>
parents:
28759
diff
changeset
|
1218 if (f->f_stacktop != NULL) { |
|
af53729d3cdd
Armin Rigo's fix & test for
Michael W. Hudson <mwh@python.net>
parents:
28759
diff
changeset
|
1219 stack_pointer = f->f_stacktop; |
|
af53729d3cdd
Armin Rigo's fix & test for
Michael W. Hudson <mwh@python.net>
parents:
28759
diff
changeset
|
1220 f->f_stacktop = NULL; |
|
af53729d3cdd
Armin Rigo's fix & test for
Michael W. Hudson <mwh@python.net>
parents:
28759
diff
changeset
|
1221 } |
|
af53729d3cdd
Armin Rigo's fix & test for
Michael W. Hudson <mwh@python.net>
parents:
28759
diff
changeset
|
1222 if (err) { |
|
26110
964d6b79c22e
This is Richie Hindle's patch:
Michael W. Hudson <mwh@python.net>
parents:
26109
diff
changeset
|
1223 /* trace function raised an exception */ |
|
964d6b79c22e
This is Richie Hindle's patch:
Michael W. Hudson <mwh@python.net>
parents:
26109
diff
changeset
|
1224 goto on_error; |
|
964d6b79c22e
This is Richie Hindle's patch:
Michael W. Hudson <mwh@python.net>
parents:
26109
diff
changeset
|
1225 } |
|
26109
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
26079
diff
changeset
|
1226 } |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
26079
diff
changeset
|
1227 |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1228 /* Extract opcode and argument */ |
|
1016
a41e3ba5b47d
Add some debugging features if DEBUG defined
Guido van Rossum <guido@python.org>
parents:
974
diff
changeset
|
1229 |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1230 opcode = NEXTOP(); |
|
32359
e5bc947c44ca
Performance tweak: allow stack_pointer and oparg to be register variables.
Armin Rigo <arigo@tunes.org>
parents:
32301
diff
changeset
|
1231 oparg = 0; /* allows oparg to be stored in a register because |
|
e5bc947c44ca
Performance tweak: allow stack_pointer and oparg to be register variables.
Armin Rigo <arigo@tunes.org>
parents:
32301
diff
changeset
|
1232 it doesn't have to be remembered across a full loop */ |
|
31894
310dd98ea064
Revert 2.393, elimination of pre-decrementing, which
Raymond Hettinger <python@rcn.com>
parents:
31880
diff
changeset
|
1233 if (HAS_ARG(opcode)) |
|
310dd98ea064
Revert 2.393, elimination of pre-decrementing, which
Raymond Hettinger <python@rcn.com>
parents:
31880
diff
changeset
|
1234 oparg = NEXTARG(); |
|
14147
21ec69a56228
Charles G. Waldman <cgw@fnal.gov>:
Fred Drake <fdrake@acm.org>
parents:
14100
diff
changeset
|
1235 dispatch_opcode: |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
1236 #ifdef DYNAMIC_EXECUTION_PROFILE |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
1237 #ifdef DXPAIRS |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
1238 dxpairs[lastopcode][opcode]++; |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
1239 lastopcode = opcode; |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
1240 #endif |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
1241 dxp[opcode]++; |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
1242 #endif |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1243 |
| 567 | 1244 #ifdef LLTRACE |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1245 /* Instruction tracing */ |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1246 |
| 567 | 1247 if (lltrace) { |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1248 if (HAS_ARG(opcode)) { |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1249 printf("%d: %d, %d\n", |
| 24844 | 1250 f->f_lasti, opcode, oparg); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1251 } |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1252 else { |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1253 printf("%d: %d\n", |
| 24844 | 1254 f->f_lasti, opcode); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1255 } |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1256 } |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1257 #endif |
| 24844 | 1258 |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1259 /* Main switch on opcode */ |
|
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
|
1260 READ_TIMESTAMP(inst0); |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
1261 |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1262 switch (opcode) { |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1263 |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1264 /* BEWARE! |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1265 It is essential that any operation that fails sets either |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1266 x to NULL, err to nonzero, or why to anything but WHY_NOT, |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1267 and that no operation that succeeds does this! */ |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1268 |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1269 /* case STOP_CODE: this is an error! */ |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1270 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1271 TARGET(NOP) |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1272 FAST_DISPATCH(); |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1273 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1274 TARGET(LOAD_FAST) |
|
21974
052efc06520a
Move some opcodes to top of big eval_frame switch statement. Skip
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
21935
diff
changeset
|
1275 x = GETLOCAL(oparg); |
|
052efc06520a
Move some opcodes to top of big eval_frame switch statement. Skip
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
21935
diff
changeset
|
1276 if (x != NULL) { |
|
052efc06520a
Move some opcodes to top of big eval_frame switch statement. Skip
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
21935
diff
changeset
|
1277 Py_INCREF(x); |
|
052efc06520a
Move some opcodes to top of big eval_frame switch statement. Skip
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
21935
diff
changeset
|
1278 PUSH(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1279 FAST_DISPATCH(); |
|
21974
052efc06520a
Move some opcodes to top of big eval_frame switch statement. Skip
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
21935
diff
changeset
|
1280 } |
|
052efc06520a
Move some opcodes to top of big eval_frame switch statement. Skip
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
21935
diff
changeset
|
1281 format_exc_check_arg(PyExc_UnboundLocalError, |
|
052efc06520a
Move some opcodes to top of big eval_frame switch statement. Skip
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
21935
diff
changeset
|
1282 UNBOUNDLOCAL_ERROR_MSG, |
|
052efc06520a
Move some opcodes to top of big eval_frame switch statement. Skip
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
21935
diff
changeset
|
1283 PyTuple_GetItem(co->co_varnames, oparg)); |
|
052efc06520a
Move some opcodes to top of big eval_frame switch statement. Skip
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
21935
diff
changeset
|
1284 break; |
|
052efc06520a
Move some opcodes to top of big eval_frame switch statement. Skip
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
21935
diff
changeset
|
1285 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1286 TARGET(LOAD_CONST) |
|
24545
d2f41c8a81f0
small speedup for constant and name access
Skip Montanaro <skip@pobox.com>
parents:
24284
diff
changeset
|
1287 x = GETITEM(consts, oparg); |
|
21974
052efc06520a
Move some opcodes to top of big eval_frame switch statement. Skip
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
21935
diff
changeset
|
1288 Py_INCREF(x); |
|
052efc06520a
Move some opcodes to top of big eval_frame switch statement. Skip
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
21935
diff
changeset
|
1289 PUSH(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1290 FAST_DISPATCH(); |
|
21974
052efc06520a
Move some opcodes to top of big eval_frame switch statement. Skip
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
21935
diff
changeset
|
1291 |
|
28304
b14d6741f496
Eliminate data dependency in predict macro.
Raymond Hettinger <python@rcn.com>
parents:
28303
diff
changeset
|
1292 PREDICTED_WITH_ARG(STORE_FAST); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1293 TARGET(STORE_FAST) |
|
21974
052efc06520a
Move some opcodes to top of big eval_frame switch statement. Skip
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
21935
diff
changeset
|
1294 v = POP(); |
|
052efc06520a
Move some opcodes to top of big eval_frame switch statement. Skip
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
21935
diff
changeset
|
1295 SETLOCAL(oparg, v); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1296 FAST_DISPATCH(); |
|
21974
052efc06520a
Move some opcodes to top of big eval_frame switch statement. Skip
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
21935
diff
changeset
|
1297 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1298 TARGET(POP_TOP) |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1299 v = POP(); |
| 5368 | 1300 Py_DECREF(v); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1301 FAST_DISPATCH(); |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1302 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1303 TARGET(ROT_TWO) |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1304 v = TOP(); |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1305 w = SECOND(); |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1306 SET_TOP(w); |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1307 SET_SECOND(v); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1308 FAST_DISPATCH(); |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1309 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1310 TARGET(ROT_THREE) |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1311 v = TOP(); |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1312 w = SECOND(); |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1313 x = THIRD(); |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1314 SET_TOP(w); |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1315 SET_SECOND(x); |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1316 SET_THIRD(v); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1317 FAST_DISPATCH(); |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1318 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1319 TARGET(ROT_FOUR) |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1320 u = TOP(); |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1321 v = SECOND(); |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1322 w = THIRD(); |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1323 x = FOURTH(); |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1324 SET_TOP(v); |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1325 SET_SECOND(w); |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1326 SET_THIRD(x); |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1327 SET_FOURTH(u); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1328 FAST_DISPATCH(); |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1329 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1330 TARGET(DUP_TOP) |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1331 v = TOP(); |
| 5368 | 1332 Py_INCREF(v); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1333 PUSH(v); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1334 FAST_DISPATCH(); |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1335 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1336 TARGET(DUP_TOPX) |
|
27295
b8387730dd8f
SF patch #670367: Micro-optimizations for ceval.c
Raymond Hettinger <python@rcn.com>
parents:
27243
diff
changeset
|
1337 if (oparg == 2) { |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1338 x = TOP(); |
|
15151
ca9f6a8e9885
Attempt to fix bogus gcc -Wall warnings reported by Marc-Andre Lemburg,
Tim Peters <tim.peters@gmail.com>
parents:
14869
diff
changeset
|
1339 Py_INCREF(x); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1340 w = SECOND(); |
|
15151
ca9f6a8e9885
Attempt to fix bogus gcc -Wall warnings reported by Marc-Andre Lemburg,
Tim Peters <tim.peters@gmail.com>
parents:
14869
diff
changeset
|
1341 Py_INCREF(w); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1342 STACKADJ(2); |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1343 SET_TOP(x); |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1344 SET_SECOND(w); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1345 FAST_DISPATCH(); |
|
27295
b8387730dd8f
SF patch #670367: Micro-optimizations for ceval.c
Raymond Hettinger <python@rcn.com>
parents:
27243
diff
changeset
|
1346 } else if (oparg == 3) { |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1347 x = TOP(); |
|
15151
ca9f6a8e9885
Attempt to fix bogus gcc -Wall warnings reported by Marc-Andre Lemburg,
Tim Peters <tim.peters@gmail.com>
parents:
14869
diff
changeset
|
1348 Py_INCREF(x); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1349 w = SECOND(); |
|
15151
ca9f6a8e9885
Attempt to fix bogus gcc -Wall warnings reported by Marc-Andre Lemburg,
Tim Peters <tim.peters@gmail.com>
parents:
14869
diff
changeset
|
1350 Py_INCREF(w); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1351 v = THIRD(); |
|
15151
ca9f6a8e9885
Attempt to fix bogus gcc -Wall warnings reported by Marc-Andre Lemburg,
Tim Peters <tim.peters@gmail.com>
parents:
14869
diff
changeset
|
1352 Py_INCREF(v); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1353 STACKADJ(3); |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1354 SET_TOP(x); |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1355 SET_SECOND(w); |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1356 SET_THIRD(v); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1357 FAST_DISPATCH(); |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1358 } |
|
27295
b8387730dd8f
SF patch #670367: Micro-optimizations for ceval.c
Raymond Hettinger <python@rcn.com>
parents:
27243
diff
changeset
|
1359 Py_FatalError("invalid argument to DUP_TOPX" |
|
b8387730dd8f
SF patch #670367: Micro-optimizations for ceval.c
Raymond Hettinger <python@rcn.com>
parents:
27243
diff
changeset
|
1360 " (bytecode corruption?)"); |
|
50112
abf815b80b5d
Merged revisions 67666,67685 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
50104
diff
changeset
|
1361 /* Never returns, so don't bother to set why. */ |
|
15151
ca9f6a8e9885
Attempt to fix bogus gcc -Wall warnings reported by Marc-Andre Lemburg,
Tim Peters <tim.peters@gmail.com>
parents:
14869
diff
changeset
|
1362 break; |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1363 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1364 TARGET(UNARY_POSITIVE) |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1365 v = TOP(); |
|
5413
10267fdc7531
Used operators from abstract.h where possible (arithmetic operators,
Guido van Rossum <guido@python.org>
parents:
5405
diff
changeset
|
1366 x = PyNumber_Positive(v); |
| 5368 | 1367 Py_DECREF(v); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1368 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1369 if (x != NULL) DISPATCH(); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1370 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1371 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1372 TARGET(UNARY_NEGATIVE) |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1373 v = TOP(); |
|
5413
10267fdc7531
Used operators from abstract.h where possible (arithmetic operators,
Guido van Rossum <guido@python.org>
parents:
5405
diff
changeset
|
1374 x = PyNumber_Negative(v); |
| 5368 | 1375 Py_DECREF(v); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1376 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1377 if (x != NULL) DISPATCH(); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1378 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1379 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1380 TARGET(UNARY_NOT) |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1381 v = TOP(); |
|
5413
10267fdc7531
Used operators from abstract.h where possible (arithmetic operators,
Guido van Rossum <guido@python.org>
parents:
5405
diff
changeset
|
1382 err = PyObject_IsTrue(v); |
| 5368 | 1383 Py_DECREF(v); |
|
5413
10267fdc7531
Used operators from abstract.h where possible (arithmetic operators,
Guido van Rossum <guido@python.org>
parents:
5405
diff
changeset
|
1384 if (err == 0) { |
|
10267fdc7531
Used operators from abstract.h where possible (arithmetic operators,
Guido van Rossum <guido@python.org>
parents:
5405
diff
changeset
|
1385 Py_INCREF(Py_True); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1386 SET_TOP(Py_True); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1387 DISPATCH(); |
|
5413
10267fdc7531
Used operators from abstract.h where possible (arithmetic operators,
Guido van Rossum <guido@python.org>
parents:
5405
diff
changeset
|
1388 } |
|
10267fdc7531
Used operators from abstract.h where possible (arithmetic operators,
Guido van Rossum <guido@python.org>
parents:
5405
diff
changeset
|
1389 else if (err > 0) { |
|
10267fdc7531
Used operators from abstract.h where possible (arithmetic operators,
Guido van Rossum <guido@python.org>
parents:
5405
diff
changeset
|
1390 Py_INCREF(Py_False); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1391 SET_TOP(Py_False); |
|
5413
10267fdc7531
Used operators from abstract.h where possible (arithmetic operators,
Guido van Rossum <guido@python.org>
parents:
5405
diff
changeset
|
1392 err = 0; |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1393 DISPATCH(); |
|
5413
10267fdc7531
Used operators from abstract.h where possible (arithmetic operators,
Guido van Rossum <guido@python.org>
parents:
5405
diff
changeset
|
1394 } |
|
27243
3afbd55fb18f
Replaced POP() with STACKADJ(-1) on lines where the result wasn't used.
Raymond Hettinger <python@rcn.com>
parents:
27201
diff
changeset
|
1395 STACKADJ(-1); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1396 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1397 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1398 TARGET(UNARY_INVERT) |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1399 v = TOP(); |
|
5413
10267fdc7531
Used operators from abstract.h where possible (arithmetic operators,
Guido van Rossum <guido@python.org>
parents:
5405
diff
changeset
|
1400 x = PyNumber_Invert(v); |
| 5368 | 1401 Py_DECREF(v); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1402 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1403 if (x != NULL) DISPATCH(); |
|
409
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
401
diff
changeset
|
1404 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1405 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1406 TARGET(BINARY_POWER) |
|
3324
36920bbd81a8
changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents:
3294
diff
changeset
|
1407 w = POP(); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1408 v = TOP(); |
|
5413
10267fdc7531
Used operators from abstract.h where possible (arithmetic operators,
Guido van Rossum <guido@python.org>
parents:
5405
diff
changeset
|
1409 x = PyNumber_Power(v, w, Py_None); |
| 5368 | 1410 Py_DECREF(v); |
| 1411 Py_DECREF(w); | |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1412 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1413 if (x != NULL) DISPATCH(); |
|
3324
36920bbd81a8
changes for complex and power (**) operator
Guido van Rossum <guido@python.org>
parents:
3294
diff
changeset
|
1414 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1415 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1416 TARGET(BINARY_MULTIPLY) |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1417 w = POP(); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1418 v = TOP(); |
|
5413
10267fdc7531
Used operators from abstract.h where possible (arithmetic operators,
Guido van Rossum <guido@python.org>
parents:
5405
diff
changeset
|
1419 x = PyNumber_Multiply(v, w); |
| 5368 | 1420 Py_DECREF(v); |
| 1421 Py_DECREF(w); | |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1422 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1423 if (x != NULL) DISPATCH(); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1424 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1425 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1426 TARGET(BINARY_TRUE_DIVIDE) |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1427 w = POP(); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1428 v = TOP(); |
|
21251
45e1177424e1
SF bug #488514: -Qnew needs work
Tim Peters <tim.peters@gmail.com>
parents:
21171
diff
changeset
|
1429 x = PyNumber_TrueDivide(v, w); |
| 5368 | 1430 Py_DECREF(v); |
| 1431 Py_DECREF(w); | |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1432 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1433 if (x != NULL) DISPATCH(); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1434 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1435 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1436 TARGET(BINARY_FLOOR_DIVIDE) |
|
19051
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1437 w = POP(); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1438 v = TOP(); |
|
19051
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1439 x = PyNumber_FloorDivide(v, w); |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1440 Py_DECREF(v); |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1441 Py_DECREF(w); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1442 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1443 if (x != NULL) DISPATCH(); |
|
19051
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1444 break; |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1445 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1446 TARGET(BINARY_MODULO) |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1447 w = POP(); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1448 v = TOP(); |
|
51872
3722ce458318
Merged revisions 69811,69947 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
51853
diff
changeset
|
1449 if (PyUnicode_CheckExact(v)) |
|
3722ce458318
Merged revisions 69811,69947 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
51853
diff
changeset
|
1450 x = PyUnicode_Format(v, w); |
|
3722ce458318
Merged revisions 69811,69947 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
51853
diff
changeset
|
1451 else |
|
3722ce458318
Merged revisions 69811,69947 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
51853
diff
changeset
|
1452 x = PyNumber_Remainder(v, w); |
| 5368 | 1453 Py_DECREF(v); |
| 1454 Py_DECREF(w); | |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1455 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1456 if (x != NULL) DISPATCH(); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1457 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1458 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1459 TARGET(BINARY_ADD) |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1460 w = POP(); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1461 v = TOP(); |
|
44156
fb84bd9500a4
Remove special-casing of integer operations, to stop
Martin v. Löwis <martin@v.loewis.de>
parents:
44099
diff
changeset
|
1462 if (PyUnicode_CheckExact(v) && |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43569
diff
changeset
|
1463 PyUnicode_CheckExact(w)) { |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43569
diff
changeset
|
1464 x = unicode_concatenate(v, w, f, next_instr); |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43569
diff
changeset
|
1465 /* unicode_concatenate consumed the ref to v */ |
|
32974
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
1466 goto skip_decref_vx; |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
1467 } |
|
19434
c140bd7d3bdc
When an inlined operation on two small ints causes overflow, don't
Guido van Rossum <guido@python.org>
parents:
19369
diff
changeset
|
1468 else { |
|
5829
f1127d6fcd74
Huge speedup by inlining some common integer operations:
Guido van Rossum <guido@python.org>
parents:
5610
diff
changeset
|
1469 x = PyNumber_Add(v, w); |
|
19434
c140bd7d3bdc
When an inlined operation on two small ints causes overflow, don't
Guido van Rossum <guido@python.org>
parents:
19369
diff
changeset
|
1470 } |
| 5368 | 1471 Py_DECREF(v); |
|
32974
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
1472 skip_decref_vx: |
| 5368 | 1473 Py_DECREF(w); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1474 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1475 if (x != NULL) DISPATCH(); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1476 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1477 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1478 TARGET(BINARY_SUBTRACT) |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1479 w = POP(); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1480 v = TOP(); |
|
44156
fb84bd9500a4
Remove special-casing of integer operations, to stop
Martin v. Löwis <martin@v.loewis.de>
parents:
44099
diff
changeset
|
1481 x = PyNumber_Subtract(v, w); |
| 5368 | 1482 Py_DECREF(v); |
| 1483 Py_DECREF(w); | |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1484 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1485 if (x != NULL) DISPATCH(); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1486 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1487 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1488 TARGET(BINARY_SUBSCR) |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1489 w = POP(); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1490 v = TOP(); |
|
44156
fb84bd9500a4
Remove special-casing of integer operations, to stop
Martin v. Löwis <martin@v.loewis.de>
parents:
44099
diff
changeset
|
1491 x = PyObject_GetItem(v, w); |
| 5368 | 1492 Py_DECREF(v); |
| 1493 Py_DECREF(w); | |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1494 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1495 if (x != NULL) DISPATCH(); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1496 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1497 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1498 TARGET(BINARY_LSHIFT) |
|
409
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
401
diff
changeset
|
1499 w = POP(); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1500 v = TOP(); |
|
5413
10267fdc7531
Used operators from abstract.h where possible (arithmetic operators,
Guido van Rossum <guido@python.org>
parents:
5405
diff
changeset
|
1501 x = PyNumber_Lshift(v, w); |
| 5368 | 1502 Py_DECREF(v); |
| 1503 Py_DECREF(w); | |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1504 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1505 if (x != NULL) DISPATCH(); |
|
409
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
401
diff
changeset
|
1506 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1507 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1508 TARGET(BINARY_RSHIFT) |
|
409
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
401
diff
changeset
|
1509 w = POP(); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1510 v = TOP(); |
|
5413
10267fdc7531
Used operators from abstract.h where possible (arithmetic operators,
Guido van Rossum <guido@python.org>
parents:
5405
diff
changeset
|
1511 x = PyNumber_Rshift(v, w); |
| 5368 | 1512 Py_DECREF(v); |
| 1513 Py_DECREF(w); | |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1514 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1515 if (x != NULL) DISPATCH(); |
|
409
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
401
diff
changeset
|
1516 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1517 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1518 TARGET(BINARY_AND) |
|
409
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
401
diff
changeset
|
1519 w = POP(); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1520 v = TOP(); |
|
5413
10267fdc7531
Used operators from abstract.h where possible (arithmetic operators,
Guido van Rossum <guido@python.org>
parents:
5405
diff
changeset
|
1521 x = PyNumber_And(v, w); |
| 5368 | 1522 Py_DECREF(v); |
| 1523 Py_DECREF(w); | |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1524 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1525 if (x != NULL) DISPATCH(); |
|
409
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
401
diff
changeset
|
1526 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1527 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1528 TARGET(BINARY_XOR) |
|
409
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
401
diff
changeset
|
1529 w = POP(); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1530 v = TOP(); |
|
5413
10267fdc7531
Used operators from abstract.h where possible (arithmetic operators,
Guido van Rossum <guido@python.org>
parents:
5405
diff
changeset
|
1531 x = PyNumber_Xor(v, w); |
| 5368 | 1532 Py_DECREF(v); |
| 1533 Py_DECREF(w); | |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1534 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1535 if (x != NULL) DISPATCH(); |
|
409
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
401
diff
changeset
|
1536 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1537 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1538 TARGET(BINARY_OR) |
|
409
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
401
diff
changeset
|
1539 w = POP(); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1540 v = TOP(); |
|
5413
10267fdc7531
Used operators from abstract.h where possible (arithmetic operators,
Guido van Rossum <guido@python.org>
parents:
5405
diff
changeset
|
1541 x = PyNumber_Or(v, w); |
| 5368 | 1542 Py_DECREF(v); |
| 1543 Py_DECREF(w); | |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1544 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1545 if (x != NULL) DISPATCH(); |
|
409
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
401
diff
changeset
|
1546 break; |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1547 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1548 TARGET(LIST_APPEND) |
|
31618
bc006682acb2
SF patch #910929: Optimize list comprehensions
Raymond Hettinger <python@rcn.com>
parents:
31606
diff
changeset
|
1549 w = POP(); |
|
50211
2ee4653927f7
Merged revisions 67818 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50112
diff
changeset
|
1550 v = stack_pointer[-oparg]; |
|
31618
bc006682acb2
SF patch #910929: Optimize list comprehensions
Raymond Hettinger <python@rcn.com>
parents:
31606
diff
changeset
|
1551 err = PyList_Append(v, w); |
|
bc006682acb2
SF patch #910929: Optimize list comprehensions
Raymond Hettinger <python@rcn.com>
parents:
31606
diff
changeset
|
1552 Py_DECREF(w); |
|
31649
243642bbd03f
LIST_APPEND is predicably followed by JUMP_ABSOLUTE.
Raymond Hettinger <python@rcn.com>
parents:
31647
diff
changeset
|
1553 if (err == 0) { |
|
243642bbd03f
LIST_APPEND is predicably followed by JUMP_ABSOLUTE.
Raymond Hettinger <python@rcn.com>
parents:
31647
diff
changeset
|
1554 PREDICT(JUMP_ABSOLUTE); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1555 DISPATCH(); |
|
31649
243642bbd03f
LIST_APPEND is predicably followed by JUMP_ABSOLUTE.
Raymond Hettinger <python@rcn.com>
parents:
31647
diff
changeset
|
1556 } |
|
31618
bc006682acb2
SF patch #910929: Optimize list comprehensions
Raymond Hettinger <python@rcn.com>
parents:
31606
diff
changeset
|
1557 break; |
|
bc006682acb2
SF patch #910929: Optimize list comprehensions
Raymond Hettinger <python@rcn.com>
parents:
31606
diff
changeset
|
1558 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1559 TARGET(SET_ADD) |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41226
diff
changeset
|
1560 w = POP(); |
|
50211
2ee4653927f7
Merged revisions 67818 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50112
diff
changeset
|
1561 v = stack_pointer[-oparg]; |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41226
diff
changeset
|
1562 err = PySet_Add(v, w); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41226
diff
changeset
|
1563 Py_DECREF(w); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41226
diff
changeset
|
1564 if (err == 0) { |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41226
diff
changeset
|
1565 PREDICT(JUMP_ABSOLUTE); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1566 DISPATCH(); |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41226
diff
changeset
|
1567 } |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41226
diff
changeset
|
1568 break; |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41226
diff
changeset
|
1569 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1570 TARGET(INPLACE_POWER) |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1571 w = POP(); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1572 v = TOP(); |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1573 x = PyNumber_InPlacePower(v, w, Py_None); |
|
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1574 Py_DECREF(v); |
|
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1575 Py_DECREF(w); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1576 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1577 if (x != NULL) DISPATCH(); |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1578 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1579 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1580 TARGET(INPLACE_MULTIPLY) |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1581 w = POP(); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1582 v = TOP(); |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1583 x = PyNumber_InPlaceMultiply(v, w); |
|
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1584 Py_DECREF(v); |
|
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1585 Py_DECREF(w); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1586 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1587 if (x != NULL) DISPATCH(); |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1588 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1589 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1590 TARGET(INPLACE_TRUE_DIVIDE) |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1591 w = POP(); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1592 v = TOP(); |
|
21537
ca27d82ac89b
SF bug #496549 -Qnew and in-place division "/=".
Tim Peters <tim.peters@gmail.com>
parents:
21477
diff
changeset
|
1593 x = PyNumber_InPlaceTrueDivide(v, w); |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1594 Py_DECREF(v); |
|
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1595 Py_DECREF(w); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1596 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1597 if (x != NULL) DISPATCH(); |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1598 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1599 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1600 TARGET(INPLACE_FLOOR_DIVIDE) |
|
19051
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1601 w = POP(); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1602 v = TOP(); |
|
19051
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1603 x = PyNumber_InPlaceFloorDivide(v, w); |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1604 Py_DECREF(v); |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1605 Py_DECREF(w); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1606 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1607 if (x != NULL) DISPATCH(); |
|
19051
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1608 break; |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1609 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1610 TARGET(INPLACE_MODULO) |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1611 w = POP(); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1612 v = TOP(); |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1613 x = PyNumber_InPlaceRemainder(v, w); |
|
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1614 Py_DECREF(v); |
|
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1615 Py_DECREF(w); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1616 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1617 if (x != NULL) DISPATCH(); |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1618 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1619 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1620 TARGET(INPLACE_ADD) |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1621 w = POP(); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1622 v = TOP(); |
|
44156
fb84bd9500a4
Remove special-casing of integer operations, to stop
Martin v. Löwis <martin@v.loewis.de>
parents:
44099
diff
changeset
|
1623 if (PyUnicode_CheckExact(v) && |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43569
diff
changeset
|
1624 PyUnicode_CheckExact(w)) { |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43569
diff
changeset
|
1625 x = unicode_concatenate(v, w, f, next_instr); |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43569
diff
changeset
|
1626 /* unicode_concatenate consumed the ref to v */ |
|
32974
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
1627 goto skip_decref_v; |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
1628 } |
|
19434
c140bd7d3bdc
When an inlined operation on two small ints causes overflow, don't
Guido van Rossum <guido@python.org>
parents:
19369
diff
changeset
|
1629 else { |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1630 x = PyNumber_InPlaceAdd(v, w); |
|
19434
c140bd7d3bdc
When an inlined operation on two small ints causes overflow, don't
Guido van Rossum <guido@python.org>
parents:
19369
diff
changeset
|
1631 } |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1632 Py_DECREF(v); |
|
32974
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
1633 skip_decref_v: |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1634 Py_DECREF(w); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1635 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1636 if (x != NULL) DISPATCH(); |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1637 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1638 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1639 TARGET(INPLACE_SUBTRACT) |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1640 w = POP(); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1641 v = TOP(); |
|
44156
fb84bd9500a4
Remove special-casing of integer operations, to stop
Martin v. Löwis <martin@v.loewis.de>
parents:
44099
diff
changeset
|
1642 x = PyNumber_InPlaceSubtract(v, w); |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1643 Py_DECREF(v); |
|
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1644 Py_DECREF(w); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1645 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1646 if (x != NULL) DISPATCH(); |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1647 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1648 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1649 TARGET(INPLACE_LSHIFT) |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1650 w = POP(); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1651 v = TOP(); |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1652 x = PyNumber_InPlaceLshift(v, w); |
|
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1653 Py_DECREF(v); |
|
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1654 Py_DECREF(w); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1655 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1656 if (x != NULL) DISPATCH(); |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1657 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1658 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1659 TARGET(INPLACE_RSHIFT) |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1660 w = POP(); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1661 v = TOP(); |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1662 x = PyNumber_InPlaceRshift(v, w); |
|
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1663 Py_DECREF(v); |
|
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1664 Py_DECREF(w); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1665 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1666 if (x != NULL) DISPATCH(); |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1667 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1668 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1669 TARGET(INPLACE_AND) |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1670 w = POP(); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1671 v = TOP(); |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1672 x = PyNumber_InPlaceAnd(v, w); |
|
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1673 Py_DECREF(v); |
|
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1674 Py_DECREF(w); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1675 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1676 if (x != NULL) DISPATCH(); |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1677 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1678 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1679 TARGET(INPLACE_XOR) |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1680 w = POP(); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1681 v = TOP(); |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1682 x = PyNumber_InPlaceXor(v, w); |
|
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1683 Py_DECREF(v); |
|
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1684 Py_DECREF(w); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1685 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1686 if (x != NULL) DISPATCH(); |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1687 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1688 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1689 TARGET(INPLACE_OR) |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1690 w = POP(); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1691 v = TOP(); |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1692 x = PyNumber_InPlaceOr(v, w); |
|
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1693 Py_DECREF(v); |
|
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1694 Py_DECREF(w); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1695 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1696 if (x != NULL) DISPATCH(); |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1697 break; |
|
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1698 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1699 TARGET(STORE_SUBSCR) |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1700 w = TOP(); |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1701 v = SECOND(); |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1702 u = THIRD(); |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1703 STACKADJ(-3); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1704 /* v[w] = u */ |
|
5413
10267fdc7531
Used operators from abstract.h where possible (arithmetic operators,
Guido van Rossum <guido@python.org>
parents:
5405
diff
changeset
|
1705 err = PyObject_SetItem(v, w, u); |
| 5368 | 1706 Py_DECREF(u); |
| 1707 Py_DECREF(v); | |
| 1708 Py_DECREF(w); | |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1709 if (err == 0) DISPATCH(); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1710 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1711 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1712 TARGET(DELETE_SUBSCR) |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1713 w = TOP(); |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1714 v = SECOND(); |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1715 STACKADJ(-2); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1716 /* del v[w] */ |
|
5413
10267fdc7531
Used operators from abstract.h where possible (arithmetic operators,
Guido van Rossum <guido@python.org>
parents:
5405
diff
changeset
|
1717 err = PyObject_DelItem(v, w); |
| 5368 | 1718 Py_DECREF(v); |
| 1719 Py_DECREF(w); | |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1720 if (err == 0) DISPATCH(); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1721 break; |
|
14100
2de0cc174c3b
PEP 214, Extended print Statement, has been accepted by the BDFL.
Barry Warsaw <barry@python.org>
parents:
14080
diff
changeset
|
1722 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1723 TARGET(PRINT_EXPR) |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1724 v = POP(); |
|
15811
1a00d21910c8
Implementation of PEP-0217.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
15809
diff
changeset
|
1725 w = PySys_GetObject("displayhook"); |
|
1a00d21910c8
Implementation of PEP-0217.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
15809
diff
changeset
|
1726 if (w == NULL) { |
|
1a00d21910c8
Implementation of PEP-0217.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
15809
diff
changeset
|
1727 PyErr_SetString(PyExc_RuntimeError, |
|
1a00d21910c8
Implementation of PEP-0217.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
15809
diff
changeset
|
1728 "lost sys.displayhook"); |
|
1a00d21910c8
Implementation of PEP-0217.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
15809
diff
changeset
|
1729 err = -1; |
|
15814
faaf9f10d849
Fixed bugs noted by Greg Stein
Moshe Zadka <moshez@math.huji.ac.il>
parents:
15811
diff
changeset
|
1730 x = NULL; |
|
15811
1a00d21910c8
Implementation of PEP-0217.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
15809
diff
changeset
|
1731 } |
|
1a00d21910c8
Implementation of PEP-0217.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
15809
diff
changeset
|
1732 if (err == 0) { |
|
30683
3b59fa5d25b1
Simplify and speedup uses of Py_BuildValue():
Raymond Hettinger <python@rcn.com>
parents:
29669
diff
changeset
|
1733 x = PyTuple_Pack(1, v); |
|
15811
1a00d21910c8
Implementation of PEP-0217.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
15809
diff
changeset
|
1734 if (x == NULL) |
|
1a00d21910c8
Implementation of PEP-0217.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
15809
diff
changeset
|
1735 err = -1; |
|
1a00d21910c8
Implementation of PEP-0217.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
15809
diff
changeset
|
1736 } |
|
1a00d21910c8
Implementation of PEP-0217.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
15809
diff
changeset
|
1737 if (err == 0) { |
|
1a00d21910c8
Implementation of PEP-0217.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
15809
diff
changeset
|
1738 w = PyEval_CallObject(w, x); |
|
15814
faaf9f10d849
Fixed bugs noted by Greg Stein
Moshe Zadka <moshez@math.huji.ac.il>
parents:
15811
diff
changeset
|
1739 Py_XDECREF(w); |
|
15811
1a00d21910c8
Implementation of PEP-0217.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
15809
diff
changeset
|
1740 if (w == NULL) |
|
1a00d21910c8
Implementation of PEP-0217.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
15809
diff
changeset
|
1741 err = -1; |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1742 } |
| 5368 | 1743 Py_DECREF(v); |
|
15811
1a00d21910c8
Implementation of PEP-0217.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
15809
diff
changeset
|
1744 Py_XDECREF(x); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1745 break; |
|
15811
1a00d21910c8
Implementation of PEP-0217.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
15809
diff
changeset
|
1746 |
|
14163
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1747 #ifdef CASE_TOO_BIG |
|
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1748 default: switch (opcode) { |
|
1b9fd0cbd914
Support for three-token characters (**=, >>=, <<=) which was written by
Thomas Wouters <thomas@python.org>
parents:
14147
diff
changeset
|
1749 #endif |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1750 TARGET(RAISE_VARARGS) |
|
43102
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
1751 v = w = NULL; |
|
2813
999b5bdc18ce
3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents:
2612
diff
changeset
|
1752 switch (oparg) { |
| 43411 | 1753 case 2: |
| 1754 v = POP(); /* cause */ | |
|
2813
999b5bdc18ce
3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents:
2612
diff
changeset
|
1755 case 1: |
|
999b5bdc18ce
3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents:
2612
diff
changeset
|
1756 w = POP(); /* exc */ |
|
7946
ad114620f8c2
Make first raise argument optional
Guido van Rossum <guido@python.org>
parents:
7014
diff
changeset
|
1757 case 0: /* Fallthrough */ |
|
43102
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
1758 why = do_raise(w, v); |
|
2813
999b5bdc18ce
3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents:
2612
diff
changeset
|
1759 break; |
|
999b5bdc18ce
3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents:
2612
diff
changeset
|
1760 default: |
| 5368 | 1761 PyErr_SetString(PyExc_SystemError, |
|
2813
999b5bdc18ce
3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents:
2612
diff
changeset
|
1762 "bad RAISE_VARARGS oparg"); |
|
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
|
1763 why = WHY_EXCEPTION; |
|
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
|
1764 break; |
|
464
90300ca21200
Added STORE_GLOBAL and DELETE_GLOBAL.
Guido van Rossum <guido@python.org>
parents:
409
diff
changeset
|
1765 } |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1766 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1767 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1768 TARGET(STORE_LOCALS) |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40946
diff
changeset
|
1769 x = POP(); |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40946
diff
changeset
|
1770 v = f->f_locals; |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40946
diff
changeset
|
1771 Py_XDECREF(v); |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40946
diff
changeset
|
1772 f->f_locals = x; |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1773 DISPATCH(); |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1774 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1775 TARGET(RETURN_VALUE) |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1776 retval = POP(); |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1777 why = WHY_RETURN; |
|
31462
d5c047807c69
SF patch #864059: optimize eval_frame
Raymond Hettinger <python@rcn.com>
parents:
30979
diff
changeset
|
1778 goto fast_block_end; |
|
1354
fccd415e2eb8
* bltinmodule.c: removed exec() built-in function.
Guido van Rossum <guido@python.org>
parents:
1319
diff
changeset
|
1779 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1780 TARGET(YIELD_VALUE) |
|
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
|
1781 retval = POP(); |
|
18237
f02605b8fdc1
PyFrameObject: rename f_stackbottom to f_stacktop, since it points to
Tim Peters <tim.peters@gmail.com>
parents:
18195
diff
changeset
|
1782 f->f_stacktop = stack_pointer; |
|
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
|
1783 why = WHY_YIELD; |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1784 /* Put aside the current exception state and restore |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1785 that of the calling frame. This only serves when |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1786 "yield" is used inside an except handler. */ |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1787 SWAP_EXC_STATE(); |
|
31462
d5c047807c69
SF patch #864059: optimize eval_frame
Raymond Hettinger <python@rcn.com>
parents:
30979
diff
changeset
|
1788 goto fast_yield; |
|
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
|
1789 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1790 TARGET(POP_EXCEPT) |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1791 { |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1792 PyTryBlock *b = PyFrame_BlockPop(f); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1793 if (b->b_type != EXCEPT_HANDLER) { |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1794 PyErr_SetString(PyExc_SystemError, |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1795 "popped block is not an except handler"); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1796 why = WHY_EXCEPTION; |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1797 break; |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1798 } |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1799 UNWIND_EXCEPT_HANDLER(b); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1800 } |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1801 DISPATCH(); |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1802 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1803 TARGET(POP_BLOCK) |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1804 { |
| 5368 | 1805 PyTryBlock *b = PyFrame_BlockPop(f); |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1806 UNWIND_BLOCK(b); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1807 } |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1808 DISPATCH(); |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1809 |
|
45635
882eba145119
Merged revisions 61189-61190,61192,61194-61195,61198-61199 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45017
diff
changeset
|
1810 PREDICTED(END_FINALLY); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1811 TARGET(END_FINALLY) |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1812 v = POP(); |
|
44099
f324631462a2
Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents:
43996
diff
changeset
|
1813 if (PyLong_Check(v)) { |
|
f324631462a2
Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents:
43996
diff
changeset
|
1814 why = (enum why_code) PyLong_AS_LONG(v); |
|
31872
9f5fe6b23e59
Since the fast_yield branch target was introduced, it appears that most
Tim Peters <tim.peters@gmail.com>
parents:
31797
diff
changeset
|
1815 assert(why != WHY_YIELD); |
|
31900
0265bf9912ea
Some (but not all) of the why code bitfield tests ran faster as
Raymond Hettinger <python@rcn.com>
parents:
31894
diff
changeset
|
1816 if (why == WHY_RETURN || |
|
0265bf9912ea
Some (but not all) of the why code bitfield tests ran faster as
Raymond Hettinger <python@rcn.com>
parents:
31894
diff
changeset
|
1817 why == WHY_CONTINUE) |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1818 retval = POP(); |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1819 if (why == WHY_SILENCED) { |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1820 /* An exception was silenced by 'with', we must |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1821 manually unwind the EXCEPT_HANDLER block which was |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1822 created when the exception was caught, otherwise |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1823 the stack will be in an inconsistent state. */ |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1824 PyTryBlock *b = PyFrame_BlockPop(f); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1825 if (b->b_type != EXCEPT_HANDLER) { |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1826 PyErr_SetString(PyExc_SystemError, |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1827 "popped block is not an except handler"); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1828 why = WHY_EXCEPTION; |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1829 } |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1830 else { |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1831 UNWIND_EXCEPT_HANDLER(b); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1832 why = WHY_NOT; |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1833 } |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
1834 } |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1835 } |
|
40942
4b9d0dac79cc
You can no longer catch non-BaseException objects; TypeError is raised if such
Brett Cannon <bcannon@gmail.com>
parents:
40937
diff
changeset
|
1836 else if (PyExceptionClass_Check(v)) { |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1837 w = POP(); |
|
2813
999b5bdc18ce
3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents:
2612
diff
changeset
|
1838 u = POP(); |
| 5368 | 1839 PyErr_Restore(v, w, u); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1840 why = WHY_RERAISE; |
|
2872
d3b07ba3e12d
fix bogus DECREF in finally clause
Guido van Rossum <guido@python.org>
parents:
2866
diff
changeset
|
1841 break; |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1842 } |
| 5368 | 1843 else if (v != Py_None) { |
| 1844 PyErr_SetString(PyExc_SystemError, | |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1845 "'finally' pops bad exception"); |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1846 why = WHY_EXCEPTION; |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1847 } |
| 5368 | 1848 Py_DECREF(v); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1849 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1850 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1851 TARGET(LOAD_BUILD_CLASS) |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40946
diff
changeset
|
1852 x = PyDict_GetItemString(f->f_builtins, |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40946
diff
changeset
|
1853 "__build_class__"); |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40946
diff
changeset
|
1854 if (x == NULL) { |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40946
diff
changeset
|
1855 PyErr_SetString(PyExc_ImportError, |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40946
diff
changeset
|
1856 "__build_class__ not found"); |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40946
diff
changeset
|
1857 break; |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40946
diff
changeset
|
1858 } |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40946
diff
changeset
|
1859 Py_INCREF(x); |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40946
diff
changeset
|
1860 PUSH(x); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1861 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1862 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1863 TARGET(STORE_NAME) |
|
24607
3e4d432872ea
get rid of GETNAMEV macro - use GETITEM directly
Skip Montanaro <skip@pobox.com>
parents:
24545
diff
changeset
|
1864 w = GETITEM(names, oparg); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1865 v = POP(); |
|
31878
26ee1b3eb345
Small code improvements for readability, code size, and/or speed.
Raymond Hettinger <python@rcn.com>
parents:
31875
diff
changeset
|
1866 if ((x = f->f_locals) != NULL) { |
|
32890
b8c2aa2be19a
Completed the patch for Bug #215126.
Raymond Hettinger <python@rcn.com>
parents:
32531
diff
changeset
|
1867 if (PyDict_CheckExact(x)) |
|
32463
d4a59230e93a
SF Bug #215126: Over restricted type checking on eval() function
Raymond Hettinger <python@rcn.com>
parents:
32421
diff
changeset
|
1868 err = PyDict_SetItem(x, w, v); |
|
d4a59230e93a
SF Bug #215126: Over restricted type checking on eval() function
Raymond Hettinger <python@rcn.com>
parents:
32421
diff
changeset
|
1869 else |
|
d4a59230e93a
SF Bug #215126: Over restricted type checking on eval() function
Raymond Hettinger <python@rcn.com>
parents:
32421
diff
changeset
|
1870 err = PyObject_SetItem(x, w, v); |
|
31878
26ee1b3eb345
Small code improvements for readability, code size, and/or speed.
Raymond Hettinger <python@rcn.com>
parents:
31875
diff
changeset
|
1871 Py_DECREF(v); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1872 if (err == 0) DISPATCH(); |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
1873 break; |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
1874 } |
|
31878
26ee1b3eb345
Small code improvements for readability, code size, and/or speed.
Raymond Hettinger <python@rcn.com>
parents:
31875
diff
changeset
|
1875 PyErr_Format(PyExc_SystemError, |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43569
diff
changeset
|
1876 "no locals found when storing %R", w); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1877 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1878 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1879 TARGET(DELETE_NAME) |
|
24607
3e4d432872ea
get rid of GETNAMEV macro - use GETITEM directly
Skip Montanaro <skip@pobox.com>
parents:
24545
diff
changeset
|
1880 w = GETITEM(names, oparg); |
|
31878
26ee1b3eb345
Small code improvements for readability, code size, and/or speed.
Raymond Hettinger <python@rcn.com>
parents:
31875
diff
changeset
|
1881 if ((x = f->f_locals) != NULL) { |
|
32463
d4a59230e93a
SF Bug #215126: Over restricted type checking on eval() function
Raymond Hettinger <python@rcn.com>
parents:
32421
diff
changeset
|
1882 if ((err = PyObject_DelItem(x, w)) != 0) |
|
31878
26ee1b3eb345
Small code improvements for readability, code size, and/or speed.
Raymond Hettinger <python@rcn.com>
parents:
31875
diff
changeset
|
1883 format_exc_check_arg(PyExc_NameError, |
|
43418
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
1884 NAME_ERROR_MSG, |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
1885 w); |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
1886 break; |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
1887 } |
|
31878
26ee1b3eb345
Small code improvements for readability, code size, and/or speed.
Raymond Hettinger <python@rcn.com>
parents:
31875
diff
changeset
|
1888 PyErr_Format(PyExc_SystemError, |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43569
diff
changeset
|
1889 "no locals when deleting %R", w); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1890 break; |
|
944
222f04f55083
Changes so that user-defined classes can implement operations invoked
Guido van Rossum <guido@python.org>
parents:
926
diff
changeset
|
1891 |
|
28304
b14d6741f496
Eliminate data dependency in predict macro.
Raymond Hettinger <python@rcn.com>
parents:
28303
diff
changeset
|
1892 PREDICTED_WITH_ARG(UNPACK_SEQUENCE); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1893 TARGET(UNPACK_SEQUENCE) |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1894 v = POP(); |
|
43418
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
1895 if (PyTuple_CheckExact(v) && |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
1896 PyTuple_GET_SIZE(v) == oparg) { |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
1897 PyObject **items = \ |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
1898 ((PyTupleObject *)v)->ob_item; |
|
31630
b4e4dbd24fe7
Refactor and optimize code for UNPACK_SEQUENCE.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
1899 while (oparg--) { |
|
b4e4dbd24fe7
Refactor and optimize code for UNPACK_SEQUENCE.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
1900 w = items[oparg]; |
|
b4e4dbd24fe7
Refactor and optimize code for UNPACK_SEQUENCE.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
1901 Py_INCREF(w); |
|
b4e4dbd24fe7
Refactor and optimize code for UNPACK_SEQUENCE.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
1902 PUSH(w); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1903 } |
|
31880
4c6fdeb8e2e0
Use continue instead of break whereever possible.
Raymond Hettinger <python@rcn.com>
parents:
31879
diff
changeset
|
1904 Py_DECREF(v); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1905 DISPATCH(); |
|
43418
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
1906 } else if (PyList_CheckExact(v) && |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
1907 PyList_GET_SIZE(v) == oparg) { |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
1908 PyObject **items = \ |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
1909 ((PyListObject *)v)->ob_item; |
|
31630
b4e4dbd24fe7
Refactor and optimize code for UNPACK_SEQUENCE.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
1910 while (oparg--) { |
|
b4e4dbd24fe7
Refactor and optimize code for UNPACK_SEQUENCE.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
1911 w = items[oparg]; |
|
b4e4dbd24fe7
Refactor and optimize code for UNPACK_SEQUENCE.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
1912 Py_INCREF(w); |
|
b4e4dbd24fe7
Refactor and optimize code for UNPACK_SEQUENCE.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
1913 PUSH(w); |
|
6157
647e60fb3bac
eval_code2(): collapsed the implementations of UNPACK_TUPLE and
Barry Warsaw <barry@python.org>
parents:
6147
diff
changeset
|
1914 } |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
1915 } else if (unpack_iterable(v, oparg, -1, |
|
43418
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
1916 stack_pointer + oparg)) { |
|
18195
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
1917 stack_pointer += oparg; |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
1918 } else { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
1919 /* unpack_iterable() raised an exception */ |
|
6157
647e60fb3bac
eval_code2(): collapsed the implementations of UNPACK_TUPLE and
Barry Warsaw <barry@python.org>
parents:
6147
diff
changeset
|
1920 why = WHY_EXCEPTION; |
|
20183
c6b6189a8397
SF bug [#466173] unpack TypeError unclear
Tim Peters <tim.peters@gmail.com>
parents:
20114
diff
changeset
|
1921 } |
| 5368 | 1922 Py_DECREF(v); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1923 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1924 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1925 TARGET(UNPACK_EX) |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
1926 { |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
1927 int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8); |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
1928 v = POP(); |
|
48574
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
1929 |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
1930 if (unpack_iterable(v, oparg & 0xFF, oparg >> 8, |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
1931 stack_pointer + totalargs)) { |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
1932 stack_pointer += totalargs; |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
1933 } else { |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
1934 why = WHY_EXCEPTION; |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
1935 } |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
1936 Py_DECREF(v); |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
1937 break; |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
1938 } |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
1939 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1940 TARGET(STORE_ATTR) |
|
24607
3e4d432872ea
get rid of GETNAMEV macro - use GETITEM directly
Skip Montanaro <skip@pobox.com>
parents:
24545
diff
changeset
|
1941 w = GETITEM(names, oparg); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1942 v = TOP(); |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1943 u = SECOND(); |
|
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
1944 STACKADJ(-2); |
| 5368 | 1945 err = PyObject_SetAttr(v, w, u); /* v.w = u */ |
| 1946 Py_DECREF(v); | |
| 1947 Py_DECREF(u); | |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1948 if (err == 0) DISPATCH(); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1949 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1950 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1951 TARGET(DELETE_ATTR) |
|
24607
3e4d432872ea
get rid of GETNAMEV macro - use GETITEM directly
Skip Montanaro <skip@pobox.com>
parents:
24545
diff
changeset
|
1952 w = GETITEM(names, oparg); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1953 v = POP(); |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5368
diff
changeset
|
1954 err = PyObject_SetAttr(v, w, (PyObject *)NULL); |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5368
diff
changeset
|
1955 /* del v.w */ |
| 5368 | 1956 Py_DECREF(v); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1957 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1958 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1959 TARGET(STORE_GLOBAL) |
|
24607
3e4d432872ea
get rid of GETNAMEV macro - use GETITEM directly
Skip Montanaro <skip@pobox.com>
parents:
24545
diff
changeset
|
1960 w = GETITEM(names, oparg); |
|
464
90300ca21200
Added STORE_GLOBAL and DELETE_GLOBAL.
Guido van Rossum <guido@python.org>
parents:
409
diff
changeset
|
1961 v = POP(); |
| 5368 | 1962 err = PyDict_SetItem(f->f_globals, w, v); |
| 1963 Py_DECREF(v); | |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1964 if (err == 0) DISPATCH(); |
|
464
90300ca21200
Added STORE_GLOBAL and DELETE_GLOBAL.
Guido van Rossum <guido@python.org>
parents:
409
diff
changeset
|
1965 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1966 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1967 TARGET(DELETE_GLOBAL) |
|
24607
3e4d432872ea
get rid of GETNAMEV macro - use GETITEM directly
Skip Montanaro <skip@pobox.com>
parents:
24545
diff
changeset
|
1968 w = GETITEM(names, oparg); |
| 5368 | 1969 if ((err = PyDict_DelItem(f->f_globals, w)) != 0) |
|
14268
cd8b815cb196
Better error message with UnboundLocalError
Paul Prescod <prescod@prescod.net>
parents:
14238
diff
changeset
|
1970 format_exc_check_arg( |
|
16257
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16017
diff
changeset
|
1971 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w); |
|
464
90300ca21200
Added STORE_GLOBAL and DELETE_GLOBAL.
Guido van Rossum <guido@python.org>
parents:
409
diff
changeset
|
1972 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
1973 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
1974 TARGET(LOAD_NAME) |
|
24607
3e4d432872ea
get rid of GETNAMEV macro - use GETITEM directly
Skip Montanaro <skip@pobox.com>
parents:
24545
diff
changeset
|
1975 w = GETITEM(names, oparg); |
|
32463
d4a59230e93a
SF Bug #215126: Over restricted type checking on eval() function
Raymond Hettinger <python@rcn.com>
parents:
32421
diff
changeset
|
1976 if ((v = f->f_locals) == NULL) { |
|
16017
7234d7c3c29f
clearer error messages for apply() and "no locals"
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15948
diff
changeset
|
1977 PyErr_Format(PyExc_SystemError, |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43569
diff
changeset
|
1978 "no locals when loading %R", w); |
|
50112
abf815b80b5d
Merged revisions 67666,67685 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
50104
diff
changeset
|
1979 why = WHY_EXCEPTION; |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
1980 break; |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
1981 } |
|
32900
ac73f6662e11
Fix for the unfortunate fact that PyDict_GetItem and PyObject_GetItem
Michael W. Hudson <mwh@python.net>
parents:
32890
diff
changeset
|
1982 if (PyDict_CheckExact(v)) { |
|
32463
d4a59230e93a
SF Bug #215126: Over restricted type checking on eval() function
Raymond Hettinger <python@rcn.com>
parents:
32421
diff
changeset
|
1983 x = PyDict_GetItem(v, w); |
|
32900
ac73f6662e11
Fix for the unfortunate fact that PyDict_GetItem and PyObject_GetItem
Michael W. Hudson <mwh@python.net>
parents:
32890
diff
changeset
|
1984 Py_XINCREF(x); |
|
ac73f6662e11
Fix for the unfortunate fact that PyDict_GetItem and PyObject_GetItem
Michael W. Hudson <mwh@python.net>
parents:
32890
diff
changeset
|
1985 } |
|
32463
d4a59230e93a
SF Bug #215126: Over restricted type checking on eval() function
Raymond Hettinger <python@rcn.com>
parents:
32421
diff
changeset
|
1986 else { |
|
d4a59230e93a
SF Bug #215126: Over restricted type checking on eval() function
Raymond Hettinger <python@rcn.com>
parents:
32421
diff
changeset
|
1987 x = PyObject_GetItem(v, w); |
|
d4a59230e93a
SF Bug #215126: Over restricted type checking on eval() function
Raymond Hettinger <python@rcn.com>
parents:
32421
diff
changeset
|
1988 if (x == NULL && PyErr_Occurred()) { |
|
43418
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
1989 if (!PyErr_ExceptionMatches( |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
1990 PyExc_KeyError)) |
|
32463
d4a59230e93a
SF Bug #215126: Over restricted type checking on eval() function
Raymond Hettinger <python@rcn.com>
parents:
32421
diff
changeset
|
1991 break; |
|
d4a59230e93a
SF Bug #215126: Over restricted type checking on eval() function
Raymond Hettinger <python@rcn.com>
parents:
32421
diff
changeset
|
1992 PyErr_Clear(); |
|
d4a59230e93a
SF Bug #215126: Over restricted type checking on eval() function
Raymond Hettinger <python@rcn.com>
parents:
32421
diff
changeset
|
1993 } |
|
d4a59230e93a
SF Bug #215126: Over restricted type checking on eval() function
Raymond Hettinger <python@rcn.com>
parents:
32421
diff
changeset
|
1994 } |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1995 if (x == NULL) { |
| 5368 | 1996 x = PyDict_GetItem(f->f_globals, w); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1997 if (x == NULL) { |
| 5368 | 1998 x = PyDict_GetItem(f->f_builtins, w); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
1999 if (x == NULL) { |
|
14268
cd8b815cb196
Better error message with UnboundLocalError
Paul Prescod <prescod@prescod.net>
parents:
14238
diff
changeset
|
2000 format_exc_check_arg( |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2001 PyExc_NameError, |
|
43418
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
2002 NAME_ERROR_MSG, w); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2003 break; |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2004 } |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2005 } |
|
32900
ac73f6662e11
Fix for the unfortunate fact that PyDict_GetItem and PyObject_GetItem
Michael W. Hudson <mwh@python.net>
parents:
32890
diff
changeset
|
2006 Py_INCREF(x); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2007 } |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2008 PUSH(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2009 DISPATCH(); |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2010 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2011 TARGET(LOAD_GLOBAL) |
|
24607
3e4d432872ea
get rid of GETNAMEV macro - use GETITEM directly
Skip Montanaro <skip@pobox.com>
parents:
24545
diff
changeset
|
2012 w = GETITEM(names, oparg); |
| 42860 | 2013 if (PyUnicode_CheckExact(w)) { |
|
24900
2cdf3d0dfabd
Add a warning comment to the LOAD_GLOBAL inline code.
Guido van Rossum <guido@python.org>
parents:
24899
diff
changeset
|
2014 /* Inline the PyDict_GetItem() calls. |
|
2cdf3d0dfabd
Add a warning comment to the LOAD_GLOBAL inline code.
Guido van Rossum <guido@python.org>
parents:
24899
diff
changeset
|
2015 WARNING: this is an extreme speed hack. |
|
2cdf3d0dfabd
Add a warning comment to the LOAD_GLOBAL inline code.
Guido van Rossum <guido@python.org>
parents:
24899
diff
changeset
|
2016 Do not try this at home. */ |
| 42860 | 2017 long hash = ((PyUnicodeObject *)w)->hash; |
|
24899
8f8fe990e82c
Another ugly inlining hack, expanding the two PyDict_GetItem() calls
Guido van Rossum <guido@python.org>
parents:
24870
diff
changeset
|
2018 if (hash != -1) { |
|
8f8fe990e82c
Another ugly inlining hack, expanding the two PyDict_GetItem() calls
Guido van Rossum <guido@python.org>
parents:
24870
diff
changeset
|
2019 PyDictObject *d; |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2020 PyDictEntry *e; |
|
24899
8f8fe990e82c
Another ugly inlining hack, expanding the two PyDict_GetItem() calls
Guido van Rossum <guido@python.org>
parents:
24870
diff
changeset
|
2021 d = (PyDictObject *)(f->f_globals); |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2022 e = d->ma_lookup(d, w, hash); |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2023 if (e == NULL) { |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2024 x = NULL; |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2025 break; |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2026 } |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2027 x = e->me_value; |
|
24899
8f8fe990e82c
Another ugly inlining hack, expanding the two PyDict_GetItem() calls
Guido van Rossum <guido@python.org>
parents:
24870
diff
changeset
|
2028 if (x != NULL) { |
|
8f8fe990e82c
Another ugly inlining hack, expanding the two PyDict_GetItem() calls
Guido van Rossum <guido@python.org>
parents:
24870
diff
changeset
|
2029 Py_INCREF(x); |
|
8f8fe990e82c
Another ugly inlining hack, expanding the two PyDict_GetItem() calls
Guido van Rossum <guido@python.org>
parents:
24870
diff
changeset
|
2030 PUSH(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2031 DISPATCH(); |
|
24899
8f8fe990e82c
Another ugly inlining hack, expanding the two PyDict_GetItem() calls
Guido van Rossum <guido@python.org>
parents:
24870
diff
changeset
|
2032 } |
|
8f8fe990e82c
Another ugly inlining hack, expanding the two PyDict_GetItem() calls
Guido van Rossum <guido@python.org>
parents:
24870
diff
changeset
|
2033 d = (PyDictObject *)(f->f_builtins); |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2034 e = d->ma_lookup(d, w, hash); |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2035 if (e == NULL) { |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2036 x = NULL; |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2037 break; |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2038 } |
|
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2039 x = e->me_value; |
|
24899
8f8fe990e82c
Another ugly inlining hack, expanding the two PyDict_GetItem() calls
Guido van Rossum <guido@python.org>
parents:
24870
diff
changeset
|
2040 if (x != NULL) { |
|
8f8fe990e82c
Another ugly inlining hack, expanding the two PyDict_GetItem() calls
Guido van Rossum <guido@python.org>
parents:
24870
diff
changeset
|
2041 Py_INCREF(x); |
|
8f8fe990e82c
Another ugly inlining hack, expanding the two PyDict_GetItem() calls
Guido van Rossum <guido@python.org>
parents:
24870
diff
changeset
|
2042 PUSH(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2043 DISPATCH(); |
|
24899
8f8fe990e82c
Another ugly inlining hack, expanding the two PyDict_GetItem() calls
Guido van Rossum <guido@python.org>
parents:
24870
diff
changeset
|
2044 } |
|
8f8fe990e82c
Another ugly inlining hack, expanding the two PyDict_GetItem() calls
Guido van Rossum <guido@python.org>
parents:
24870
diff
changeset
|
2045 goto load_global_error; |
|
8f8fe990e82c
Another ugly inlining hack, expanding the two PyDict_GetItem() calls
Guido van Rossum <guido@python.org>
parents:
24870
diff
changeset
|
2046 } |
|
8f8fe990e82c
Another ugly inlining hack, expanding the two PyDict_GetItem() calls
Guido van Rossum <guido@python.org>
parents:
24870
diff
changeset
|
2047 } |
|
8f8fe990e82c
Another ugly inlining hack, expanding the two PyDict_GetItem() calls
Guido van Rossum <guido@python.org>
parents:
24870
diff
changeset
|
2048 /* This is the un-inlined version of the code above */ |
| 5368 | 2049 x = PyDict_GetItem(f->f_globals, w); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2050 if (x == NULL) { |
| 5368 | 2051 x = PyDict_GetItem(f->f_builtins, w); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2052 if (x == NULL) { |
|
24899
8f8fe990e82c
Another ugly inlining hack, expanding the two PyDict_GetItem() calls
Guido van Rossum <guido@python.org>
parents:
24870
diff
changeset
|
2053 load_global_error: |
|
14268
cd8b815cb196
Better error message with UnboundLocalError
Paul Prescod <prescod@prescod.net>
parents:
14238
diff
changeset
|
2054 format_exc_check_arg( |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2055 PyExc_NameError, |
|
24899
8f8fe990e82c
Another ugly inlining hack, expanding the two PyDict_GetItem() calls
Guido van Rossum <guido@python.org>
parents:
24870
diff
changeset
|
2056 GLOBAL_NAME_ERROR_MSG, w); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2057 break; |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2058 } |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2059 } |
| 5368 | 2060 Py_INCREF(x); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2061 PUSH(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2062 DISPATCH(); |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2063 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2064 TARGET(DELETE_FAST) |
|
8318
ec87b62466d3
DELETE_FAST should issue an exception when the local variable is undefined.
Guido van Rossum <guido@python.org>
parents:
7982
diff
changeset
|
2065 x = GETLOCAL(oparg); |
|
31878
26ee1b3eb345
Small code improvements for readability, code size, and/or speed.
Raymond Hettinger <python@rcn.com>
parents:
31875
diff
changeset
|
2066 if (x != NULL) { |
|
26ee1b3eb345
Small code improvements for readability, code size, and/or speed.
Raymond Hettinger <python@rcn.com>
parents:
31875
diff
changeset
|
2067 SETLOCAL(oparg, NULL); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2068 DISPATCH(); |
|
8318
ec87b62466d3
DELETE_FAST should issue an exception when the local variable is undefined.
Guido van Rossum <guido@python.org>
parents:
7982
diff
changeset
|
2069 } |
|
31878
26ee1b3eb345
Small code improvements for readability, code size, and/or speed.
Raymond Hettinger <python@rcn.com>
parents:
31875
diff
changeset
|
2070 format_exc_check_arg( |
|
26ee1b3eb345
Small code improvements for readability, code size, and/or speed.
Raymond Hettinger <python@rcn.com>
parents:
31875
diff
changeset
|
2071 PyExc_UnboundLocalError, |
|
26ee1b3eb345
Small code improvements for readability, code size, and/or speed.
Raymond Hettinger <python@rcn.com>
parents:
31875
diff
changeset
|
2072 UNBOUNDLOCAL_ERROR_MSG, |
|
26ee1b3eb345
Small code improvements for readability, code size, and/or speed.
Raymond Hettinger <python@rcn.com>
parents:
31875
diff
changeset
|
2073 PyTuple_GetItem(co->co_varnames, oparg) |
|
26ee1b3eb345
Small code improvements for readability, code size, and/or speed.
Raymond Hettinger <python@rcn.com>
parents:
31875
diff
changeset
|
2074 ); |
|
26ee1b3eb345
Small code improvements for readability, code size, and/or speed.
Raymond Hettinger <python@rcn.com>
parents:
31875
diff
changeset
|
2075 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2076 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2077 TARGET(LOAD_CLOSURE) |
|
16355
e4420c2468f9
Remove f_closure slot of frameobject and use f_localsplus instead.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16257
diff
changeset
|
2078 x = freevars[oparg]; |
|
16257
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16017
diff
changeset
|
2079 Py_INCREF(x); |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16017
diff
changeset
|
2080 PUSH(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2081 if (x != NULL) DISPATCH(); |
|
16257
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16017
diff
changeset
|
2082 break; |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16017
diff
changeset
|
2083 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2084 TARGET(LOAD_DEREF) |
|
16355
e4420c2468f9
Remove f_closure slot of frameobject and use f_localsplus instead.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16257
diff
changeset
|
2085 x = freevars[oparg]; |
|
16257
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16017
diff
changeset
|
2086 w = PyCell_Get(x); |
|
31878
26ee1b3eb345
Small code improvements for readability, code size, and/or speed.
Raymond Hettinger <python@rcn.com>
parents:
31875
diff
changeset
|
2087 if (w != NULL) { |
|
26ee1b3eb345
Small code improvements for readability, code size, and/or speed.
Raymond Hettinger <python@rcn.com>
parents:
31875
diff
changeset
|
2088 PUSH(w); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2089 DISPATCH(); |
|
31878
26ee1b3eb345
Small code improvements for readability, code size, and/or speed.
Raymond Hettinger <python@rcn.com>
parents:
31875
diff
changeset
|
2090 } |
|
26ee1b3eb345
Small code improvements for readability, code size, and/or speed.
Raymond Hettinger <python@rcn.com>
parents:
31875
diff
changeset
|
2091 err = -1; |
|
26ee1b3eb345
Small code improvements for readability, code size, and/or speed.
Raymond Hettinger <python@rcn.com>
parents:
31875
diff
changeset
|
2092 /* Don't stomp existing exception */ |
|
26ee1b3eb345
Small code improvements for readability, code size, and/or speed.
Raymond Hettinger <python@rcn.com>
parents:
31875
diff
changeset
|
2093 if (PyErr_Occurred()) |
|
16453
2e3dd62ceac5
SF patch 103596 by Nick Mathewson: rause UnboundLocalError for
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16398
diff
changeset
|
2094 break; |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
2095 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) { |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
2096 v = PyTuple_GET_ITEM(co->co_cellvars, |
|
31878
26ee1b3eb345
Small code improvements for readability, code size, and/or speed.
Raymond Hettinger <python@rcn.com>
parents:
31875
diff
changeset
|
2097 oparg); |
|
26ee1b3eb345
Small code improvements for readability, code size, and/or speed.
Raymond Hettinger <python@rcn.com>
parents:
31875
diff
changeset
|
2098 format_exc_check_arg( |
|
26ee1b3eb345
Small code improvements for readability, code size, and/or speed.
Raymond Hettinger <python@rcn.com>
parents:
31875
diff
changeset
|
2099 PyExc_UnboundLocalError, |
|
26ee1b3eb345
Small code improvements for readability, code size, and/or speed.
Raymond Hettinger <python@rcn.com>
parents:
31875
diff
changeset
|
2100 UNBOUNDLOCAL_ERROR_MSG, |
|
26ee1b3eb345
Small code improvements for readability, code size, and/or speed.
Raymond Hettinger <python@rcn.com>
parents:
31875
diff
changeset
|
2101 v); |
|
26ee1b3eb345
Small code improvements for readability, code size, and/or speed.
Raymond Hettinger <python@rcn.com>
parents:
31875
diff
changeset
|
2102 } else { |
|
43418
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
2103 v = PyTuple_GET_ITEM(co->co_freevars, oparg - |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
2104 PyTuple_GET_SIZE(co->co_cellvars)); |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
2105 format_exc_check_arg(PyExc_NameError, |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
2106 UNBOUNDFREE_ERROR_MSG, v); |
|
16453
2e3dd62ceac5
SF patch 103596 by Nick Mathewson: rause UnboundLocalError for
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16398
diff
changeset
|
2107 } |
|
16257
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16017
diff
changeset
|
2108 break; |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16017
diff
changeset
|
2109 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2110 TARGET(STORE_DEREF) |
|
16257
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16017
diff
changeset
|
2111 w = POP(); |
|
16355
e4420c2468f9
Remove f_closure slot of frameobject and use f_localsplus instead.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16257
diff
changeset
|
2112 x = freevars[oparg]; |
|
16257
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16017
diff
changeset
|
2113 PyCell_Set(x, w); |
|
17034
ba81d79dc3a3
Variety of small INC/DECREF patches that fix reported memory leaks
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16631
diff
changeset
|
2114 Py_DECREF(w); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2115 DISPATCH(); |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2116 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2117 TARGET(BUILD_TUPLE) |
| 5368 | 2118 x = PyTuple_New(oparg); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2119 if (x != NULL) { |
|
31894
310dd98ea064
Revert 2.393, elimination of pre-decrementing, which
Raymond Hettinger <python@rcn.com>
parents:
31880
diff
changeset
|
2120 for (; --oparg >= 0;) { |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2121 w = POP(); |
| 5368 | 2122 PyTuple_SET_ITEM(x, oparg, w); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2123 } |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2124 PUSH(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2125 DISPATCH(); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2126 } |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2127 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2128 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2129 TARGET(BUILD_LIST) |
| 5368 | 2130 x = PyList_New(oparg); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2131 if (x != NULL) { |
|
31894
310dd98ea064
Revert 2.393, elimination of pre-decrementing, which
Raymond Hettinger <python@rcn.com>
parents:
31880
diff
changeset
|
2132 for (; --oparg >= 0;) { |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2133 w = POP(); |
|
8811
e58a614fb8e4
In BUILD_LIST, use PyList_SET_ITEM() instead of PyList_SetItem(); and
Guido van Rossum <guido@python.org>
parents:
8652
diff
changeset
|
2134 PyList_SET_ITEM(x, oparg, w); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2135 } |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2136 PUSH(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2137 DISPATCH(); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2138 } |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2139 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2140 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2141 TARGET(BUILD_SET) |
|
39693
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
2142 x = PySet_New(NULL); |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
2143 if (x != NULL) { |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
2144 for (; --oparg >= 0;) { |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
2145 w = POP(); |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
2146 if (err == 0) |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
2147 err = PySet_Add(x, w); |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
2148 Py_DECREF(w); |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
2149 } |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
2150 if (err != 0) { |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
2151 Py_DECREF(x); |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
2152 break; |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
2153 } |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
2154 PUSH(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2155 DISPATCH(); |
|
39693
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
2156 } |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
2157 break; |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
2158 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2159 TARGET(BUILD_MAP) |
|
44349
4dc01402d78a
Merged revisions 59541-59561 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44310
diff
changeset
|
2160 x = _PyDict_NewPresized((Py_ssize_t)oparg); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2161 PUSH(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2162 if (x != NULL) DISPATCH(); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2163 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2164 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2165 TARGET(STORE_MAP) |
|
44349
4dc01402d78a
Merged revisions 59541-59561 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44310
diff
changeset
|
2166 w = TOP(); /* key */ |
|
4dc01402d78a
Merged revisions 59541-59561 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44310
diff
changeset
|
2167 u = SECOND(); /* value */ |
|
4dc01402d78a
Merged revisions 59541-59561 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44310
diff
changeset
|
2168 v = THIRD(); /* dict */ |
|
4dc01402d78a
Merged revisions 59541-59561 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44310
diff
changeset
|
2169 STACKADJ(-2); |
|
4dc01402d78a
Merged revisions 59541-59561 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44310
diff
changeset
|
2170 assert (PyDict_CheckExact(v)); |
|
4dc01402d78a
Merged revisions 59541-59561 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44310
diff
changeset
|
2171 err = PyDict_SetItem(v, w, u); /* v[w] = u */ |
|
4dc01402d78a
Merged revisions 59541-59561 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44310
diff
changeset
|
2172 Py_DECREF(u); |
|
4dc01402d78a
Merged revisions 59541-59561 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44310
diff
changeset
|
2173 Py_DECREF(w); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2174 if (err == 0) DISPATCH(); |
|
44349
4dc01402d78a
Merged revisions 59541-59561 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44310
diff
changeset
|
2175 break; |
|
4dc01402d78a
Merged revisions 59541-59561 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44310
diff
changeset
|
2176 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2177 TARGET(MAP_ADD) |
|
50211
2ee4653927f7
Merged revisions 67818 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50112
diff
changeset
|
2178 w = TOP(); /* key */ |
|
2ee4653927f7
Merged revisions 67818 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50112
diff
changeset
|
2179 u = SECOND(); /* value */ |
|
2ee4653927f7
Merged revisions 67818 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50112
diff
changeset
|
2180 STACKADJ(-2); |
|
2ee4653927f7
Merged revisions 67818 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50112
diff
changeset
|
2181 v = stack_pointer[-oparg]; /* dict */ |
|
2ee4653927f7
Merged revisions 67818 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50112
diff
changeset
|
2182 assert (PyDict_CheckExact(v)); |
|
2ee4653927f7
Merged revisions 67818 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50112
diff
changeset
|
2183 err = PyDict_SetItem(v, w, u); /* v[w] = u */ |
|
2ee4653927f7
Merged revisions 67818 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50112
diff
changeset
|
2184 Py_DECREF(u); |
|
2ee4653927f7
Merged revisions 67818 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50112
diff
changeset
|
2185 Py_DECREF(w); |
|
2ee4653927f7
Merged revisions 67818 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50112
diff
changeset
|
2186 if (err == 0) { |
|
2ee4653927f7
Merged revisions 67818 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50112
diff
changeset
|
2187 PREDICT(JUMP_ABSOLUTE); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2188 DISPATCH(); |
|
50211
2ee4653927f7
Merged revisions 67818 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50112
diff
changeset
|
2189 } |
|
2ee4653927f7
Merged revisions 67818 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50112
diff
changeset
|
2190 break; |
|
2ee4653927f7
Merged revisions 67818 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50112
diff
changeset
|
2191 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2192 TARGET(LOAD_ATTR) |
|
24607
3e4d432872ea
get rid of GETNAMEV macro - use GETITEM directly
Skip Montanaro <skip@pobox.com>
parents:
24545
diff
changeset
|
2193 w = GETITEM(names, oparg); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
2194 v = TOP(); |
| 5368 | 2195 x = PyObject_GetAttr(v, w); |
| 2196 Py_DECREF(v); | |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
2197 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2198 if (x != NULL) DISPATCH(); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2199 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2200 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2201 TARGET(COMPARE_OP) |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2202 w = POP(); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
2203 v = TOP(); |
|
44156
fb84bd9500a4
Remove special-casing of integer operations, to stop
Martin v. Löwis <martin@v.loewis.de>
parents:
44099
diff
changeset
|
2204 x = cmp_outcome(oparg, v, w); |
| 5368 | 2205 Py_DECREF(v); |
| 2206 Py_DECREF(w); | |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
2207 SET_TOP(x); |
|
28302
8c082936daaf
Introduced macros for a simple opcode prediction protocol.
Raymond Hettinger <python@rcn.com>
parents:
28296
diff
changeset
|
2208 if (x == NULL) break; |
|
51853
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2209 PREDICT(POP_JUMP_IF_FALSE); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2210 PREDICT(POP_JUMP_IF_TRUE); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2211 DISPATCH(); |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2212 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2213 TARGET(IMPORT_NAME) |
|
24607
3e4d432872ea
get rid of GETNAMEV macro - use GETITEM directly
Skip Montanaro <skip@pobox.com>
parents:
24545
diff
changeset
|
2214 w = GETITEM(names, oparg); |
| 5368 | 2215 x = PyDict_GetItemString(f->f_builtins, "__import__"); |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2006
diff
changeset
|
2216 if (x == NULL) { |
| 5368 | 2217 PyErr_SetString(PyExc_ImportError, |
|
5413
10267fdc7531
Used operators from abstract.h where possible (arithmetic operators,
Guido van Rossum <guido@python.org>
parents:
5405
diff
changeset
|
2218 "__import__ not found"); |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2006
diff
changeset
|
2219 break; |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2006
diff
changeset
|
2220 } |
|
44905
c0f048356c36
Merged revisions 60210-60233 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
2221 Py_INCREF(x); |
|
36712
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36702
diff
changeset
|
2222 v = POP(); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
2223 u = TOP(); |
|
44099
f324631462a2
Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents:
43996
diff
changeset
|
2224 if (PyLong_AsLong(u) != -1 || PyErr_Occurred()) |
|
36712
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36702
diff
changeset
|
2225 w = PyTuple_Pack(5, |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36702
diff
changeset
|
2226 w, |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36702
diff
changeset
|
2227 f->f_globals, |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36702
diff
changeset
|
2228 f->f_locals == NULL ? |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36702
diff
changeset
|
2229 Py_None : f->f_locals, |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36702
diff
changeset
|
2230 v, |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36702
diff
changeset
|
2231 u); |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36702
diff
changeset
|
2232 else |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36702
diff
changeset
|
2233 w = PyTuple_Pack(4, |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36702
diff
changeset
|
2234 w, |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36702
diff
changeset
|
2235 f->f_globals, |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36702
diff
changeset
|
2236 f->f_locals == NULL ? |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36702
diff
changeset
|
2237 Py_None : f->f_locals, |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36702
diff
changeset
|
2238 v); |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36702
diff
changeset
|
2239 Py_DECREF(v); |
| 5368 | 2240 Py_DECREF(u); |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2006
diff
changeset
|
2241 if (w == NULL) { |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
2242 u = POP(); |
|
44905
c0f048356c36
Merged revisions 60210-60233 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
2243 Py_DECREF(x); |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2006
diff
changeset
|
2244 x = NULL; |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2006
diff
changeset
|
2245 break; |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2006
diff
changeset
|
2246 } |
|
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
|
2247 READ_TIMESTAMP(intr0); |
|
44905
c0f048356c36
Merged revisions 60210-60233 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
2248 v = x; |
|
c0f048356c36
Merged revisions 60210-60233 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
2249 x = PyEval_CallObject(v, w); |
|
c0f048356c36
Merged revisions 60210-60233 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
2250 Py_DECREF(v); |
|
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
|
2251 READ_TIMESTAMP(intr1); |
| 5368 | 2252 Py_DECREF(w); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
2253 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2254 if (x != NULL) DISPATCH(); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2255 break; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2256 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2257 TARGET(IMPORT_STAR) |
|
14038
18385172fac0
Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents:
13930
diff
changeset
|
2258 v = POP(); |
| 5368 | 2259 PyFrame_FastToLocals(f); |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
2260 if ((x = f->f_locals) == NULL) { |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5368
diff
changeset
|
2261 PyErr_SetString(PyExc_SystemError, |
|
16017
7234d7c3c29f
clearer error messages for apply() and "no locals"
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15948
diff
changeset
|
2262 "no locals found during 'import *'"); |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
2263 break; |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
2264 } |
|
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
|
2265 READ_TIMESTAMP(intr0); |
|
14038
18385172fac0
Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents:
13930
diff
changeset
|
2266 err = import_all_from(x, v); |
|
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
|
2267 READ_TIMESTAMP(intr1); |
| 5368 | 2268 PyFrame_LocalsToFast(f, 0); |
|
14038
18385172fac0
Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents:
13930
diff
changeset
|
2269 Py_DECREF(v); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2270 if (err == 0) DISPATCH(); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2271 break; |
|
1288
9fed5726a36d
Several changes in one:
Guido van Rossum <guido@python.org>
parents:
1282
diff
changeset
|
2272 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2273 TARGET(IMPORT_FROM) |
|
24607
3e4d432872ea
get rid of GETNAMEV macro - use GETITEM directly
Skip Montanaro <skip@pobox.com>
parents:
24545
diff
changeset
|
2274 w = GETITEM(names, oparg); |
|
14038
18385172fac0
Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents:
13930
diff
changeset
|
2275 v = TOP(); |
|
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
|
2276 READ_TIMESTAMP(intr0); |
|
14038
18385172fac0
Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents:
13930
diff
changeset
|
2277 x = import_from(v, w); |
|
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
|
2278 READ_TIMESTAMP(intr1); |
|
14038
18385172fac0
Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents:
13930
diff
changeset
|
2279 PUSH(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2280 if (x != NULL) DISPATCH(); |
|
14038
18385172fac0
Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents:
13930
diff
changeset
|
2281 break; |
|
18385172fac0
Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents:
13930
diff
changeset
|
2282 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2283 TARGET(JUMP_FORWARD) |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2284 JUMPBY(oparg); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2285 FAST_DISPATCH(); |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2286 |
|
51853
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2287 PREDICTED_WITH_ARG(POP_JUMP_IF_FALSE); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2288 TARGET(POP_JUMP_IF_FALSE) |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2289 w = POP(); |
|
28302
8c082936daaf
Introduced macros for a simple opcode prediction protocol.
Raymond Hettinger <python@rcn.com>
parents:
28296
diff
changeset
|
2290 if (w == Py_True) { |
|
51853
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2291 Py_DECREF(w); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2292 FAST_DISPATCH(); |
|
28302
8c082936daaf
Introduced macros for a simple opcode prediction protocol.
Raymond Hettinger <python@rcn.com>
parents:
28296
diff
changeset
|
2293 } |
| 28077 | 2294 if (w == Py_False) { |
|
51853
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2295 Py_DECREF(w); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2296 JUMPTO(oparg); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2297 FAST_DISPATCH(); |
| 28077 | 2298 } |
| 2299 err = PyObject_IsTrue(w); | |
|
51853
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2300 Py_DECREF(w); |
|
944
222f04f55083
Changes so that user-defined classes can implement operations invoked
Guido van Rossum <guido@python.org>
parents:
926
diff
changeset
|
2301 if (err > 0) |
|
222f04f55083
Changes so that user-defined classes can implement operations invoked
Guido van Rossum <guido@python.org>
parents:
926
diff
changeset
|
2302 err = 0; |
|
222f04f55083
Changes so that user-defined classes can implement operations invoked
Guido van Rossum <guido@python.org>
parents:
926
diff
changeset
|
2303 else if (err == 0) |
|
51853
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2304 JUMPTO(oparg); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2305 else |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2306 break; |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2307 DISPATCH(); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2308 |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2309 PREDICTED_WITH_ARG(POP_JUMP_IF_TRUE); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2310 TARGET(POP_JUMP_IF_TRUE) |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2311 w = POP(); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2312 if (w == Py_False) { |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2313 Py_DECREF(w); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2314 FAST_DISPATCH(); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2315 } |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2316 if (w == Py_True) { |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2317 Py_DECREF(w); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2318 JUMPTO(oparg); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2319 FAST_DISPATCH(); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2320 } |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2321 err = PyObject_IsTrue(w); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2322 Py_DECREF(w); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2323 if (err > 0) { |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2324 err = 0; |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2325 JUMPTO(oparg); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2326 } |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2327 else if (err == 0) |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2328 ; |
|
5002
ae3b46a73765
Add "if (x != NULL) continue;" (or similar for err==0) before the
Guido van Rossum <guido@python.org>
parents:
4992
diff
changeset
|
2329 else |
|
ae3b46a73765
Add "if (x != NULL) continue;" (or similar for err==0) before the
Guido van Rossum <guido@python.org>
parents:
4992
diff
changeset
|
2330 break; |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2331 DISPATCH(); |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2332 |
|
51853
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2333 TARGET(JUMP_IF_FALSE_OR_POP) |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2334 w = TOP(); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2335 if (w == Py_True) { |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2336 STACKADJ(-1); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2337 Py_DECREF(w); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2338 FAST_DISPATCH(); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2339 } |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2340 if (w == Py_False) { |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2341 JUMPTO(oparg); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2342 FAST_DISPATCH(); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2343 } |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2344 err = PyObject_IsTrue(w); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2345 if (err > 0) { |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2346 STACKADJ(-1); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2347 Py_DECREF(w); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2348 err = 0; |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2349 } |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2350 else if (err == 0) |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2351 JUMPTO(oparg); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2352 else |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2353 break; |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2354 DISPATCH(); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2355 |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2356 TARGET(JUMP_IF_TRUE_OR_POP) |
| 28077 | 2357 w = TOP(); |
|
28302
8c082936daaf
Introduced macros for a simple opcode prediction protocol.
Raymond Hettinger <python@rcn.com>
parents:
28296
diff
changeset
|
2358 if (w == Py_False) { |
|
51853
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2359 STACKADJ(-1); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2360 Py_DECREF(w); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2361 FAST_DISPATCH(); |
|
28302
8c082936daaf
Introduced macros for a simple opcode prediction protocol.
Raymond Hettinger <python@rcn.com>
parents:
28296
diff
changeset
|
2362 } |
| 28077 | 2363 if (w == Py_True) { |
|
51853
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2364 JUMPTO(oparg); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2365 FAST_DISPATCH(); |
| 28077 | 2366 } |
| 2367 err = PyObject_IsTrue(w); | |
|
944
222f04f55083
Changes so that user-defined classes can implement operations invoked
Guido van Rossum <guido@python.org>
parents:
926
diff
changeset
|
2368 if (err > 0) { |
|
222f04f55083
Changes so that user-defined classes can implement operations invoked
Guido van Rossum <guido@python.org>
parents:
926
diff
changeset
|
2369 err = 0; |
|
51853
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2370 JUMPTO(oparg); |
|
944
222f04f55083
Changes so that user-defined classes can implement operations invoked
Guido van Rossum <guido@python.org>
parents:
926
diff
changeset
|
2371 } |
|
51853
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2372 else if (err == 0) { |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2373 STACKADJ(-1); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2374 Py_DECREF(w); |
|
643d8d4fc8eb
http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
51031
diff
changeset
|
2375 } |
|
5002
ae3b46a73765
Add "if (x != NULL) continue;" (or similar for err==0) before the
Guido van Rossum <guido@python.org>
parents:
4992
diff
changeset
|
2376 else |
|
ae3b46a73765
Add "if (x != NULL) continue;" (or similar for err==0) before the
Guido van Rossum <guido@python.org>
parents:
4992
diff
changeset
|
2377 break; |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2378 DISPATCH(); |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2379 |
|
31649
243642bbd03f
LIST_APPEND is predicably followed by JUMP_ABSOLUTE.
Raymond Hettinger <python@rcn.com>
parents:
31647
diff
changeset
|
2380 PREDICTED_WITH_ARG(JUMP_ABSOLUTE); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2381 TARGET(JUMP_ABSOLUTE) |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2382 JUMPTO(oparg); |
|
43815
85cf334b32c3
Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43777
diff
changeset
|
2383 #if FAST_LOOPS |
|
85cf334b32c3
Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43777
diff
changeset
|
2384 /* Enabling this path speeds-up all while and for-loops by bypassing |
|
85cf334b32c3
Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43777
diff
changeset
|
2385 the per-loop checks for signals. By default, this should be turned-off |
|
85cf334b32c3
Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43777
diff
changeset
|
2386 because it prevents detection of a control-break in tight loops like |
|
85cf334b32c3
Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43777
diff
changeset
|
2387 "while 1: pass". Compile with this option turned-on when you need |
|
85cf334b32c3
Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43777
diff
changeset
|
2388 the speed-up and do not need break checking inside tight loops (ones |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2389 that contain only instructions ending with FAST_DISPATCH). |
|
43815
85cf334b32c3
Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43777
diff
changeset
|
2390 */ |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2391 FAST_DISPATCH(); |
|
43815
85cf334b32c3
Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43777
diff
changeset
|
2392 #else |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2393 DISPATCH(); |
|
43815
85cf334b32c3
Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43777
diff
changeset
|
2394 #endif |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2395 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2396 TARGET(GET_ITER) |
|
17597
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17494
diff
changeset
|
2397 /* before: [obj]; after [getiter(obj)] */ |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
2398 v = TOP(); |
|
17597
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17494
diff
changeset
|
2399 x = PyObject_GetIter(v); |
|
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17494
diff
changeset
|
2400 Py_DECREF(v); |
|
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17494
diff
changeset
|
2401 if (x != NULL) { |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
2402 SET_TOP(x); |
|
28304
b14d6741f496
Eliminate data dependency in predict macro.
Raymond Hettinger <python@rcn.com>
parents:
28303
diff
changeset
|
2403 PREDICT(FOR_ITER); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2404 DISPATCH(); |
|
17597
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17494
diff
changeset
|
2405 } |
|
27243
3afbd55fb18f
Replaced POP() with STACKADJ(-1) on lines where the result wasn't used.
Raymond Hettinger <python@rcn.com>
parents:
27201
diff
changeset
|
2406 STACKADJ(-1); |
|
17597
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17494
diff
changeset
|
2407 break; |
|
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17494
diff
changeset
|
2408 |
|
28304
b14d6741f496
Eliminate data dependency in predict macro.
Raymond Hettinger <python@rcn.com>
parents:
28303
diff
changeset
|
2409 PREDICTED_WITH_ARG(FOR_ITER); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2410 TARGET(FOR_ITER) |
|
17597
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17494
diff
changeset
|
2411 /* before: [iter]; after: [iter, iter()] *or* [] */ |
|
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17494
diff
changeset
|
2412 v = TOP(); |
|
31646
83b0382e0d36
Speedup for-loops by inlining PyIter_Next(). Saves duplicate tests
Raymond Hettinger <python@rcn.com>
parents:
31630
diff
changeset
|
2413 x = (*v->ob_type->tp_iternext)(v); |
|
17617
aac65f50df6f
Mondo changes to the iterator stuff, without changing how Python code
Guido van Rossum <guido@python.org>
parents:
17600
diff
changeset
|
2414 if (x != NULL) { |
|
aac65f50df6f
Mondo changes to the iterator stuff, without changing how Python code
Guido van Rossum <guido@python.org>
parents:
17600
diff
changeset
|
2415 PUSH(x); |
|
28304
b14d6741f496
Eliminate data dependency in predict macro.
Raymond Hettinger <python@rcn.com>
parents:
28303
diff
changeset
|
2416 PREDICT(STORE_FAST); |
|
b14d6741f496
Eliminate data dependency in predict macro.
Raymond Hettinger <python@rcn.com>
parents:
28303
diff
changeset
|
2417 PREDICT(UNPACK_SEQUENCE); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2418 DISPATCH(); |
|
17597
32e7d0898eab
Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents:
17494
diff
changeset
|
2419 } |
|
31646
83b0382e0d36
Speedup for-loops by inlining PyIter_Next(). Saves duplicate tests
Raymond Hettinger <python@rcn.com>
parents:
31630
diff
changeset
|
2420 if (PyErr_Occurred()) { |
|
43418
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
2421 if (!PyErr_ExceptionMatches( |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
2422 PyExc_StopIteration)) |
|
31646
83b0382e0d36
Speedup for-loops by inlining PyIter_Next(). Saves duplicate tests
Raymond Hettinger <python@rcn.com>
parents:
31630
diff
changeset
|
2423 break; |
|
83b0382e0d36
Speedup for-loops by inlining PyIter_Next(). Saves duplicate tests
Raymond Hettinger <python@rcn.com>
parents:
31630
diff
changeset
|
2424 PyErr_Clear(); |
|
17617
aac65f50df6f
Mondo changes to the iterator stuff, without changing how Python code
Guido van Rossum <guido@python.org>
parents:
17600
diff
changeset
|
2425 } |
|
31646
83b0382e0d36
Speedup for-loops by inlining PyIter_Next(). Saves duplicate tests
Raymond Hettinger <python@rcn.com>
parents:
31630
diff
changeset
|
2426 /* iterator ended normally */ |
|
83b0382e0d36
Speedup for-loops by inlining PyIter_Next(). Saves duplicate tests
Raymond Hettinger <python@rcn.com>
parents:
31630
diff
changeset
|
2427 x = v = POP(); |
|
83b0382e0d36
Speedup for-loops by inlining PyIter_Next(). Saves duplicate tests
Raymond Hettinger <python@rcn.com>
parents:
31630
diff
changeset
|
2428 Py_DECREF(v); |
|
83b0382e0d36
Speedup for-loops by inlining PyIter_Next(). Saves duplicate tests
Raymond Hettinger <python@rcn.com>
parents:
31630
diff
changeset
|
2429 JUMPBY(oparg); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2430 DISPATCH(); |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2431 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2432 TARGET(BREAK_LOOP) |
|
31647
d10c778af167
Move the code for BREAK and CONTINUE_LOOP to be near FOR_ITER.
Raymond Hettinger <python@rcn.com>
parents:
31646
diff
changeset
|
2433 why = WHY_BREAK; |
|
d10c778af167
Move the code for BREAK and CONTINUE_LOOP to be near FOR_ITER.
Raymond Hettinger <python@rcn.com>
parents:
31646
diff
changeset
|
2434 goto fast_block_end; |
|
d10c778af167
Move the code for BREAK and CONTINUE_LOOP to be near FOR_ITER.
Raymond Hettinger <python@rcn.com>
parents:
31646
diff
changeset
|
2435 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2436 TARGET(CONTINUE_LOOP) |
|
44099
f324631462a2
Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents:
43996
diff
changeset
|
2437 retval = PyLong_FromLong(oparg); |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
2438 if (!retval) { |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
2439 x = NULL; |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
2440 break; |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
2441 } |
|
31647
d10c778af167
Move the code for BREAK and CONTINUE_LOOP to be near FOR_ITER.
Raymond Hettinger <python@rcn.com>
parents:
31646
diff
changeset
|
2442 why = WHY_CONTINUE; |
|
d10c778af167
Move the code for BREAK and CONTINUE_LOOP to be near FOR_ITER.
Raymond Hettinger <python@rcn.com>
parents:
31646
diff
changeset
|
2443 goto fast_block_end; |
|
d10c778af167
Move the code for BREAK and CONTINUE_LOOP to be near FOR_ITER.
Raymond Hettinger <python@rcn.com>
parents:
31646
diff
changeset
|
2444 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2445 TARGET_WITH_IMPL(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
|
2446 TARGET_WITH_IMPL(SETUP_EXCEPT, _setup_finally) |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2447 TARGET(SETUP_FINALLY) |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2448 _setup_finally: |
|
43418
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
2449 /* NOTE: If you add any new block-setup opcodes that |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
2450 are not try/except/finally handlers, you may need |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
2451 to update the PyGen_NeedsFinalizing() function. |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
2452 */ |
|
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
|
2453 |
| 5368 | 2454 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg, |
|
16398
80c0b280a4f9
Allow 'continue' inside 'try' clause
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16394
diff
changeset
|
2455 STACK_LEVEL()); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2456 DISPATCH(); |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2457 |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2458 TARGET(WITH_CLEANUP) |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36580
diff
changeset
|
2459 { |
|
45773
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45635
diff
changeset
|
2460 /* At the top of the stack are 1-3 values indicating |
|
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45635
diff
changeset
|
2461 how/why we entered the finally clause: |
|
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45635
diff
changeset
|
2462 - TOP = None |
|
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45635
diff
changeset
|
2463 - (TOP, SECOND) = (WHY_{RETURN,CONTINUE}), retval |
|
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45635
diff
changeset
|
2464 - TOP = WHY_*; no retval below it |
|
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45635
diff
changeset
|
2465 - (TOP, SECOND, THIRD) = exc_info() |
|
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45635
diff
changeset
|
2466 Below them is EXIT, the context.__exit__ bound method. |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36580
diff
changeset
|
2467 In the last case, we must call |
|
45773
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45635
diff
changeset
|
2468 EXIT(TOP, SECOND, THIRD) |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36580
diff
changeset
|
2469 otherwise we must call |
|
45773
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45635
diff
changeset
|
2470 EXIT(None, None, None) |
|
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45635
diff
changeset
|
2471 |
|
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45635
diff
changeset
|
2472 In all cases, we remove EXIT from the stack, leaving |
|
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45635
diff
changeset
|
2473 the rest in the same order. |
|
36737
fa92fe15251a
Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents:
36712
diff
changeset
|
2474 |
|
fa92fe15251a
Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents:
36712
diff
changeset
|
2475 In addition, if the stack represents an exception, |
|
36926
fc10ff322df1
Um, I thought I'd already checked this in.
Guido van Rossum <guido@python.org>
parents:
36882
diff
changeset
|
2476 *and* the function call returns a 'true' value, we |
|
fc10ff322df1
Um, I thought I'd already checked this in.
Guido van Rossum <guido@python.org>
parents:
36882
diff
changeset
|
2477 "zap" this information, to prevent END_FINALLY from |
|
fc10ff322df1
Um, I thought I'd already checked this in.
Guido van Rossum <guido@python.org>
parents:
36882
diff
changeset
|
2478 re-raising the exception. (But non-local gotos |
|
fc10ff322df1
Um, I thought I'd already checked this in.
Guido van Rossum <guido@python.org>
parents:
36882
diff
changeset
|
2479 should still be resumed.) |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36580
diff
changeset
|
2480 */ |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
2481 |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2482 PyObject *exit_func = POP(); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2483 u = TOP(); |
|
45773
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45635
diff
changeset
|
2484 if (u == Py_None) { |
|
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45635
diff
changeset
|
2485 v = w = Py_None; |
|
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45635
diff
changeset
|
2486 } |
|
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45635
diff
changeset
|
2487 else if (PyLong_Check(u)) { |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36580
diff
changeset
|
2488 u = v = w = Py_None; |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36580
diff
changeset
|
2489 } |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36580
diff
changeset
|
2490 else { |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2491 v = SECOND(); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2492 w = THIRD(); |
|
36926
fc10ff322df1
Um, I thought I'd already checked this in.
Guido van Rossum <guido@python.org>
parents:
36882
diff
changeset
|
2493 } |
|
fc10ff322df1
Um, I thought I'd already checked this in.
Guido van Rossum <guido@python.org>
parents:
36882
diff
changeset
|
2494 /* XXX Not the fastest way to call it... */ |
|
45773
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45635
diff
changeset
|
2495 x = PyObject_CallFunctionObjArgs(exit_func, u, v, w, |
|
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45635
diff
changeset
|
2496 NULL); |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2497 Py_DECREF(exit_func); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2498 if (x == NULL) |
|
36926
fc10ff322df1
Um, I thought I'd already checked this in.
Guido van Rossum <guido@python.org>
parents:
36882
diff
changeset
|
2499 break; /* Go to error exit */ |
|
50104
48239f6209b0
Merged revisions 67688 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
50045
diff
changeset
|
2500 |
|
48239f6209b0
Merged revisions 67688 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
50045
diff
changeset
|
2501 if (u != Py_None) |
|
48239f6209b0
Merged revisions 67688 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
50045
diff
changeset
|
2502 err = PyObject_IsTrue(x); |
|
48239f6209b0
Merged revisions 67688 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
50045
diff
changeset
|
2503 else |
|
48239f6209b0
Merged revisions 67688 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
50045
diff
changeset
|
2504 err = 0; |
|
48239f6209b0
Merged revisions 67688 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
50045
diff
changeset
|
2505 Py_DECREF(x); |
|
48239f6209b0
Merged revisions 67688 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
50045
diff
changeset
|
2506 |
|
48239f6209b0
Merged revisions 67688 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
50045
diff
changeset
|
2507 if (err < 0) |
|
48239f6209b0
Merged revisions 67688 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
50045
diff
changeset
|
2508 break; /* Go to error exit */ |
|
48239f6209b0
Merged revisions 67688 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
50045
diff
changeset
|
2509 else if (err > 0) { |
|
48239f6209b0
Merged revisions 67688 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
50045
diff
changeset
|
2510 err = 0; |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2511 /* There was an exception and a True return */ |
|
45773
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45635
diff
changeset
|
2512 STACKADJ(-2); |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2513 SET_TOP(PyLong_FromLong((long) WHY_SILENCED)); |
|
36926
fc10ff322df1
Um, I thought I'd already checked this in.
Guido van Rossum <guido@python.org>
parents:
36882
diff
changeset
|
2514 Py_DECREF(u); |
|
fc10ff322df1
Um, I thought I'd already checked this in.
Guido van Rossum <guido@python.org>
parents:
36882
diff
changeset
|
2515 Py_DECREF(v); |
|
fc10ff322df1
Um, I thought I'd already checked this in.
Guido van Rossum <guido@python.org>
parents:
36882
diff
changeset
|
2516 Py_DECREF(w); |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36580
diff
changeset
|
2517 } |
|
45635
882eba145119
Merged revisions 61189-61190,61192,61194-61195,61198-61199 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45017
diff
changeset
|
2518 PREDICT(END_FINALLY); |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36580
diff
changeset
|
2519 break; |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36580
diff
changeset
|
2520 } |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36580
diff
changeset
|
2521 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2522 TARGET(CALL_FUNCTION) |
|
32359
e5bc947c44ca
Performance tweak: allow stack_pointer and oparg to be register variables.
Armin Rigo <arigo@tunes.org>
parents:
32301
diff
changeset
|
2523 { |
|
e5bc947c44ca
Performance tweak: allow stack_pointer and oparg to be register variables.
Armin Rigo <arigo@tunes.org>
parents:
32301
diff
changeset
|
2524 PyObject **sp; |
|
27712
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
2525 PCALL(PCALL_ALL); |
|
32359
e5bc947c44ca
Performance tweak: allow stack_pointer and oparg to be register variables.
Armin Rigo <arigo@tunes.org>
parents:
32301
diff
changeset
|
2526 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
|
2527 #ifdef WITH_TSC |
|
32359
e5bc947c44ca
Performance tweak: allow stack_pointer and oparg to be register variables.
Armin Rigo <arigo@tunes.org>
parents:
32301
diff
changeset
|
2528 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
|
2529 #else |
|
32359
e5bc947c44ca
Performance tweak: allow stack_pointer and oparg to be register variables.
Armin Rigo <arigo@tunes.org>
parents:
32301
diff
changeset
|
2530 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
|
2531 #endif |
|
32359
e5bc947c44ca
Performance tweak: allow stack_pointer and oparg to be register variables.
Armin Rigo <arigo@tunes.org>
parents:
32301
diff
changeset
|
2532 stack_pointer = sp; |
|
24868
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
2533 PUSH(x); |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
2534 if (x != NULL) |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2535 DISPATCH(); |
|
24868
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
2536 break; |
|
32359
e5bc947c44ca
Performance tweak: allow stack_pointer and oparg to be register variables.
Armin Rigo <arigo@tunes.org>
parents:
32301
diff
changeset
|
2537 } |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2538 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2539 TARGET_WITH_IMPL(CALL_FUNCTION_VAR, _call_function_var_kw) |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2540 TARGET_WITH_IMPL(CALL_FUNCTION_KW, _call_function_var_kw) |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2541 TARGET(CALL_FUNCTION_VAR_KW) |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2542 _call_function_var_kw: |
|
2813
999b5bdc18ce
3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents:
2612
diff
changeset
|
2543 { |
|
12082
603db0d0aed1
slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11839
diff
changeset
|
2544 int na = oparg & 0xff; |
|
603db0d0aed1
slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11839
diff
changeset
|
2545 int nk = (oparg>>8) & 0xff; |
|
603db0d0aed1
slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11839
diff
changeset
|
2546 int flags = (opcode - CALL_FUNCTION) & 3; |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
2547 int n = na + 2 * nk; |
|
32359
e5bc947c44ca
Performance tweak: allow stack_pointer and oparg to be register variables.
Armin Rigo <arigo@tunes.org>
parents:
32301
diff
changeset
|
2548 PyObject **pfunc, *func, **sp; |
|
27712
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
2549 PCALL(PCALL_ALL); |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
2550 if (flags & CALL_FLAG_VAR) |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
2551 n++; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
2552 if (flags & CALL_FLAG_KW) |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
2553 n++; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
2554 pfunc = stack_pointer - n - 1; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
2555 func = *pfunc; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
2556 |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2557 if (PyMethod_Check(func) |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
2558 && PyMethod_GET_SELF(func) != NULL) { |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
2559 PyObject *self = PyMethod_GET_SELF(func); |
|
12082
603db0d0aed1
slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11839
diff
changeset
|
2560 Py_INCREF(self); |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
2561 func = PyMethod_GET_FUNCTION(func); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
2562 Py_INCREF(func); |
|
12082
603db0d0aed1
slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11839
diff
changeset
|
2563 Py_DECREF(*pfunc); |
|
603db0d0aed1
slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11839
diff
changeset
|
2564 *pfunc = self; |
|
603db0d0aed1
slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11839
diff
changeset
|
2565 na++; |
|
603db0d0aed1
slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11839
diff
changeset
|
2566 n++; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2567 } else |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
2568 Py_INCREF(func); |
|
32359
e5bc947c44ca
Performance tweak: allow stack_pointer and oparg to be register variables.
Armin Rigo <arigo@tunes.org>
parents:
32301
diff
changeset
|
2569 sp = stack_pointer; |
|
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
|
2570 READ_TIMESTAMP(intr0); |
|
32359
e5bc947c44ca
Performance tweak: allow stack_pointer and oparg to be register variables.
Armin Rigo <arigo@tunes.org>
parents:
32301
diff
changeset
|
2571 x = ext_do_call(func, &sp, flags, na, nk); |
|
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
|
2572 READ_TIMESTAMP(intr1); |
|
32359
e5bc947c44ca
Performance tweak: allow stack_pointer and oparg to be register variables.
Armin Rigo <arigo@tunes.org>
parents:
32301
diff
changeset
|
2573 stack_pointer = sp; |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
2574 Py_DECREF(func); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
2575 |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
2576 while (stack_pointer > pfunc) { |
|
12082
603db0d0aed1
slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11839
diff
changeset
|
2577 w = POP(); |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
2578 Py_DECREF(w); |
|
12082
603db0d0aed1
slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11839
diff
changeset
|
2579 } |
|
603db0d0aed1
slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11839
diff
changeset
|
2580 PUSH(x); |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2581 if (x != NULL) |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2582 DISPATCH(); |
|
12082
603db0d0aed1
slightly modified version of Greg Ewing's extended call syntax patch
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11839
diff
changeset
|
2583 break; |
|
2813
999b5bdc18ce
3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents:
2612
diff
changeset
|
2584 } |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2585 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2586 TARGET_WITH_IMPL(MAKE_CLOSURE, _make_function) |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2587 TARGET(MAKE_FUNCTION) |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2588 _make_function: |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
2589 { |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
2590 int posdefaults = oparg & 0xff; |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
2591 int kwdefaults = (oparg>>8) & 0xff; |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
2592 int num_annotations = (oparg >> 16) & 0x7fff; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
2593 |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
2594 v = POP(); /* code object */ |
| 5368 | 2595 x = PyFunction_New(v, f->f_globals); |
| 2596 Py_DECREF(v); | |
|
48574
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
2597 |
|
40943
c79e6234fb19
Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents:
40942
diff
changeset
|
2598 if (x != NULL && opcode == MAKE_CLOSURE) { |
|
c79e6234fb19
Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents:
40942
diff
changeset
|
2599 v = POP(); |
|
50112
abf815b80b5d
Merged revisions 67666,67685 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
50104
diff
changeset
|
2600 if (PyFunction_SetClosure(x, v) != 0) { |
|
abf815b80b5d
Merged revisions 67666,67685 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
50104
diff
changeset
|
2601 /* Can't happen unless bytecode is corrupt. */ |
|
abf815b80b5d
Merged revisions 67666,67685 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
50104
diff
changeset
|
2602 why = WHY_EXCEPTION; |
|
abf815b80b5d
Merged revisions 67666,67685 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
50104
diff
changeset
|
2603 } |
|
40943
c79e6234fb19
Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents:
40942
diff
changeset
|
2604 Py_DECREF(v); |
|
c79e6234fb19
Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents:
40942
diff
changeset
|
2605 } |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
2606 |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
2607 if (x != NULL && num_annotations > 0) { |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
2608 Py_ssize_t name_ix; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
2609 u = POP(); /* names of args with annotations */ |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
2610 v = PyDict_New(); |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
2611 if (v == NULL) { |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
2612 Py_DECREF(x); |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
2613 x = NULL; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
2614 break; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
2615 } |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
2616 name_ix = PyTuple_Size(u); |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
2617 assert(num_annotations == name_ix+1); |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
2618 while (name_ix > 0) { |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
2619 --name_ix; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
2620 t = PyTuple_GET_ITEM(u, name_ix); |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
2621 w = POP(); |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
2622 /* XXX(nnorwitz): check for errors */ |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
2623 PyDict_SetItem(v, t, w); |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
2624 Py_DECREF(w); |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
2625 } |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
2626 |
|
50112
abf815b80b5d
Merged revisions 67666,67685 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
50104
diff
changeset
|
2627 if (PyFunction_SetAnnotations(x, v) != 0) { |
|
abf815b80b5d
Merged revisions 67666,67685 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
50104
diff
changeset
|
2628 /* Can't happen unless |
|
abf815b80b5d
Merged revisions 67666,67685 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
50104
diff
changeset
|
2629 PyFunction_SetAnnotations changes. */ |
|
abf815b80b5d
Merged revisions 67666,67685 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
50104
diff
changeset
|
2630 why = WHY_EXCEPTION; |
|
abf815b80b5d
Merged revisions 67666,67685 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
50104
diff
changeset
|
2631 } |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
2632 Py_DECREF(v); |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
2633 Py_DECREF(u); |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
2634 } |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
2635 |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
2636 /* XXX Maybe this should be a separate opcode? */ |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
2637 if (x != NULL && posdefaults > 0) { |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
2638 v = PyTuple_New(posdefaults); |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
2639 if (v == NULL) { |
| 5368 | 2640 Py_DECREF(x); |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
2641 x = NULL; |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
2642 break; |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
2643 } |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
2644 while (--posdefaults >= 0) { |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
2645 w = POP(); |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
2646 PyTuple_SET_ITEM(v, posdefaults, w); |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
2647 } |
|
50112
abf815b80b5d
Merged revisions 67666,67685 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
50104
diff
changeset
|
2648 if (PyFunction_SetDefaults(x, v) != 0) { |
|
abf815b80b5d
Merged revisions 67666,67685 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
50104
diff
changeset
|
2649 /* Can't happen unless |
|
abf815b80b5d
Merged revisions 67666,67685 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
50104
diff
changeset
|
2650 PyFunction_SetDefaults changes. */ |
|
abf815b80b5d
Merged revisions 67666,67685 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
50104
diff
changeset
|
2651 why = WHY_EXCEPTION; |
|
abf815b80b5d
Merged revisions 67666,67685 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
50104
diff
changeset
|
2652 } |
| 5368 | 2653 Py_DECREF(v); |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
2654 } |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
2655 if (x != NULL && kwdefaults > 0) { |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
2656 v = PyDict_New(); |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
2657 if (v == NULL) { |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
2658 Py_DECREF(x); |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
2659 x = NULL; |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
2660 break; |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
2661 } |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
2662 while (--kwdefaults >= 0) { |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
2663 w = POP(); /* default value */ |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
2664 u = POP(); /* kw only arg name */ |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
2665 /* XXX(nnorwitz): check for errors */ |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
2666 PyDict_SetItem(v, u, w); |
|
40927
93f582803733
Fix a refleak in the MAKE_FUNCTION opcode in ceval.c.
Georg Brandl <georg@python.org>
parents:
40894
diff
changeset
|
2667 Py_DECREF(w); |
|
93f582803733
Fix a refleak in the MAKE_FUNCTION opcode in ceval.c.
Georg Brandl <georg@python.org>
parents:
40894
diff
changeset
|
2668 Py_DECREF(u); |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
2669 } |
|
50112
abf815b80b5d
Merged revisions 67666,67685 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
50104
diff
changeset
|
2670 if (PyFunction_SetKwDefaults(x, v) != 0) { |
|
abf815b80b5d
Merged revisions 67666,67685 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
50104
diff
changeset
|
2671 /* Can't happen unless |
|
abf815b80b5d
Merged revisions 67666,67685 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
50104
diff
changeset
|
2672 PyFunction_SetKwDefaults changes. */ |
|
abf815b80b5d
Merged revisions 67666,67685 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
50104
diff
changeset
|
2673 why = WHY_EXCEPTION; |
|
abf815b80b5d
Merged revisions 67666,67685 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
50104
diff
changeset
|
2674 } |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
2675 Py_DECREF(v); |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
2676 } |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
2677 PUSH(x); |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
2678 break; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
2679 } |
|
3839
22e29b1747e1
Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents:
3694
diff
changeset
|
2680 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2681 TARGET(BUILD_SLICE) |
|
3839
22e29b1747e1
Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents:
3694
diff
changeset
|
2682 if (oparg == 3) |
|
22e29b1747e1
Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents:
3694
diff
changeset
|
2683 w = POP(); |
|
22e29b1747e1
Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents:
3694
diff
changeset
|
2684 else |
|
22e29b1747e1
Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents:
3694
diff
changeset
|
2685 w = NULL; |
|
22e29b1747e1
Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents:
3694
diff
changeset
|
2686 v = POP(); |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
2687 u = TOP(); |
| 5018 | 2688 x = PySlice_New(u, v, w); |
| 5368 | 2689 Py_DECREF(u); |
| 2690 Py_DECREF(v); | |
| 2691 Py_XDECREF(w); | |
|
27186
04aa86d49d93
SF patch #664320: Replace push/pop clusters in ceval.c
Raymond Hettinger <python@rcn.com>
parents:
26141
diff
changeset
|
2692 SET_TOP(x); |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2693 if (x != NULL) DISPATCH(); |
|
3839
22e29b1747e1
Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents:
3694
diff
changeset
|
2694 break; |
|
22e29b1747e1
Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents:
3694
diff
changeset
|
2695 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2696 TARGET(EXTENDED_ARG) |
|
14147
21ec69a56228
Charles G. Waldman <cgw@fnal.gov>:
Fred Drake <fdrake@acm.org>
parents:
14100
diff
changeset
|
2697 opcode = NEXTOP(); |
|
31894
310dd98ea064
Revert 2.393, elimination of pre-decrementing, which
Raymond Hettinger <python@rcn.com>
parents:
31880
diff
changeset
|
2698 oparg = oparg<<16 | NEXTARG(); |
|
14147
21ec69a56228
Charles G. Waldman <cgw@fnal.gov>:
Fred Drake <fdrake@acm.org>
parents:
14100
diff
changeset
|
2699 goto dispatch_opcode; |
|
3839
22e29b1747e1
Changes for slice and ellipses
Guido van Rossum <guido@python.org>
parents:
3694
diff
changeset
|
2700 |
|
51031
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2701 #ifdef USE_COMPUTED_GOTOS |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2702 _unknown_opcode: |
|
d86e23318b41
Issue #4753: By enabling a configure option named '--with-computed-gotos'
Antoine Pitrou <solipsis@pitrou.net>
parents:
50840
diff
changeset
|
2703 #endif |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2704 default: |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2705 fprintf(stderr, |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2706 "XXX lineno: %d, opcode: %d\n", |
| 24844 | 2707 PyCode_Addr2Line(f->f_code, f->f_lasti), |
| 2708 opcode); | |
| 5368 | 2709 PyErr_SetString(PyExc_SystemError, "unknown opcode"); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2710 why = WHY_EXCEPTION; |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2711 break; |
|
944
222f04f55083
Changes so that user-defined classes can implement operations invoked
Guido van Rossum <guido@python.org>
parents:
926
diff
changeset
|
2712 |
|
222f04f55083
Changes so that user-defined classes can implement operations invoked
Guido van Rossum <guido@python.org>
parents:
926
diff
changeset
|
2713 #ifdef CASE_TOO_BIG |
|
222f04f55083
Changes so that user-defined classes can implement operations invoked
Guido van Rossum <guido@python.org>
parents:
926
diff
changeset
|
2714 } |
|
222f04f55083
Changes so that user-defined classes can implement operations invoked
Guido van Rossum <guido@python.org>
parents:
926
diff
changeset
|
2715 #endif |
|
222f04f55083
Changes so that user-defined classes can implement operations invoked
Guido van Rossum <guido@python.org>
parents:
926
diff
changeset
|
2716 |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2717 } /* switch */ |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2718 |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2719 on_error: |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2720 |
|
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
|
2721 READ_TIMESTAMP(inst1); |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
2722 |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2723 /* Quickly continue if no error occurred */ |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2724 |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2725 if (why == WHY_NOT) { |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
2726 if (err == 0 && x != NULL) { |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
2727 #ifdef CHECKEXC |
|
10363
4daab7a9f566
Always test for an error return (usually NULL or -1) without setting
Guido van Rossum <guido@python.org>
parents:
9679
diff
changeset
|
2728 /* This check is expensive! */ |
| 5368 | 2729 if (PyErr_Occurred()) |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
2730 fprintf(stderr, |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
2731 "XXX undetected error\n"); |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
2732 else { |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
2733 #endif |
|
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
|
2734 READ_TIMESTAMP(loop1); |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
2735 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
|
2736 #ifdef CHECKEXC |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
2737 } |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
2738 #endif |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
2739 } |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2740 why = WHY_EXCEPTION; |
| 5368 | 2741 x = Py_None; |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2742 err = 0; |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2743 } |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2744 |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2745 /* Double-check exception status */ |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2746 |
|
31900
0265bf9912ea
Some (but not all) of the why code bitfield tests ran faster as
Raymond Hettinger <python@rcn.com>
parents:
31894
diff
changeset
|
2747 if (why == WHY_EXCEPTION || why == WHY_RERAISE) { |
| 5368 | 2748 if (!PyErr_Occurred()) { |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5368
diff
changeset
|
2749 PyErr_SetString(PyExc_SystemError, |
|
10363
4daab7a9f566
Always test for an error return (usually NULL or -1) without setting
Guido van Rossum <guido@python.org>
parents:
9679
diff
changeset
|
2750 "error return without exception set"); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2751 why = WHY_EXCEPTION; |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2752 } |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2753 } |
|
10363
4daab7a9f566
Always test for an error return (usually NULL or -1) without setting
Guido van Rossum <guido@python.org>
parents:
9679
diff
changeset
|
2754 #ifdef CHECKEXC |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2755 else { |
|
10363
4daab7a9f566
Always test for an error return (usually NULL or -1) without setting
Guido van Rossum <guido@python.org>
parents:
9679
diff
changeset
|
2756 /* This check is expensive! */ |
| 5368 | 2757 if (PyErr_Occurred()) { |
|
45017
4725c84b0422
Merged revisions 60350-60363 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44905
diff
changeset
|
2758 char buf[128]; |
|
30861
c89fd7eaf875
Make undetected error on stack unwind a fatal error.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
30801
diff
changeset
|
2759 sprintf(buf, "Stack unwind with exception " |
|
c89fd7eaf875
Make undetected error on stack unwind a fatal error.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
30801
diff
changeset
|
2760 "set and why=%d", why); |
|
c89fd7eaf875
Make undetected error on stack unwind a fatal error.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
30801
diff
changeset
|
2761 Py_FatalError(buf); |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
2762 } |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2763 } |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2764 #endif |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2765 |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2766 /* Log traceback info if this is a real exception */ |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2767 |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2768 if (why == WHY_EXCEPTION) { |
| 5368 | 2769 PyTraceBack_Here(f); |
| 567 | 2770 |
|
20247
a4d328d50897
Rationalize the events passed to the profiler (no changes for the tracer).
Fred Drake <fdrake@acm.org>
parents:
20183
diff
changeset
|
2771 if (tstate->c_tracefunc != NULL) |
|
a4d328d50897
Rationalize the events passed to the profiler (no changes for the tracer).
Fred Drake <fdrake@acm.org>
parents:
20183
diff
changeset
|
2772 call_exc_trace(tstate->c_tracefunc, |
|
a4d328d50897
Rationalize the events passed to the profiler (no changes for the tracer).
Fred Drake <fdrake@acm.org>
parents:
20183
diff
changeset
|
2773 tstate->c_traceobj, f); |
|
9513
350f24180dcb
Whoops! One the "redundant" initializations removed by Vladimir in
Guido van Rossum <guido@python.org>
parents:
9490
diff
changeset
|
2774 } |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2775 |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2776 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */ |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2777 |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2778 if (why == WHY_RERAISE) |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2779 why = WHY_EXCEPTION; |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2780 |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2781 /* Unwind stacks if a (pseudo) exception occurred */ |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2782 |
|
31462
d5c047807c69
SF patch #864059: optimize eval_frame
Raymond Hettinger <python@rcn.com>
parents:
30979
diff
changeset
|
2783 fast_block_end: |
|
31872
9f5fe6b23e59
Since the fast_yield branch target was introduced, it appears that most
Tim Peters <tim.peters@gmail.com>
parents:
31797
diff
changeset
|
2784 while (why != WHY_NOT && f->f_iblock > 0) { |
| 5368 | 2785 PyTryBlock *b = PyFrame_BlockPop(f); |
|
16398
80c0b280a4f9
Allow 'continue' inside 'try' clause
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16394
diff
changeset
|
2786 |
|
31872
9f5fe6b23e59
Since the fast_yield branch target was introduced, it appears that most
Tim Peters <tim.peters@gmail.com>
parents:
31797
diff
changeset
|
2787 assert(why != WHY_YIELD); |
|
16398
80c0b280a4f9
Allow 'continue' inside 'try' clause
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16394
diff
changeset
|
2788 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) { |
|
80c0b280a4f9
Allow 'continue' inside 'try' clause
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16394
diff
changeset
|
2789 /* For a continue inside a try block, |
|
80c0b280a4f9
Allow 'continue' inside 'try' clause
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16394
diff
changeset
|
2790 don't pop the block for the loop. */ |
|
20064
ef3034a60a3e
Don't swap the arguments to PyFrame_BlockSetup when recreating the recently
Thomas Wouters <thomas@python.org>
parents:
20012
diff
changeset
|
2791 PyFrame_BlockSetup(f, b->b_type, b->b_handler, |
|
ef3034a60a3e
Don't swap the arguments to PyFrame_BlockSetup when recreating the recently
Thomas Wouters <thomas@python.org>
parents:
20012
diff
changeset
|
2792 b->b_level); |
|
16398
80c0b280a4f9
Allow 'continue' inside 'try' clause
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16394
diff
changeset
|
2793 why = WHY_NOT; |
|
44099
f324631462a2
Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents:
43996
diff
changeset
|
2794 JUMPTO(PyLong_AS_LONG(retval)); |
|
16398
80c0b280a4f9
Allow 'continue' inside 'try' clause
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16394
diff
changeset
|
2795 Py_DECREF(retval); |
|
80c0b280a4f9
Allow 'continue' inside 'try' clause
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16394
diff
changeset
|
2796 break; |
|
80c0b280a4f9
Allow 'continue' inside 'try' clause
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16394
diff
changeset
|
2797 } |
|
80c0b280a4f9
Allow 'continue' inside 'try' clause
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16394
diff
changeset
|
2798 |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2799 if (b->b_type == EXCEPT_HANDLER) { |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2800 UNWIND_EXCEPT_HANDLER(b); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2801 continue; |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2802 } |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2803 UNWIND_BLOCK(b); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2804 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) { |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2805 why = WHY_NOT; |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2806 JUMPTO(b->b_handler); |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2807 break; |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2808 } |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2809 if (why == WHY_EXCEPTION && (b->b_type == SETUP_EXCEPT |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2810 || b->b_type == SETUP_FINALLY)) { |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2811 PyObject *exc, *val, *tb; |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2812 int handler = b->b_handler; |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2813 /* Beware, this invalidates all b->b_* fields */ |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2814 PyFrame_BlockSetup(f, EXCEPT_HANDLER, -1, STACK_LEVEL()); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2815 PUSH(tstate->exc_traceback); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2816 PUSH(tstate->exc_value); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2817 if (tstate->exc_type != NULL) { |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2818 PUSH(tstate->exc_type); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2819 } |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2820 else { |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2821 Py_INCREF(Py_None); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2822 PUSH(Py_None); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2823 } |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2824 PyErr_Fetch(&exc, &val, &tb); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2825 /* Make the raw exception data |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2826 available to the handler, |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2827 so a program can emulate the |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2828 Python main loop. */ |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2829 PyErr_NormalizeException( |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2830 &exc, &val, &tb); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2831 PyException_SetTraceback(val, tb); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2832 Py_INCREF(exc); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2833 tstate->exc_type = exc; |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2834 Py_INCREF(val); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2835 tstate->exc_value = val; |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2836 tstate->exc_traceback = tb; |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2837 if (tb == NULL) |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2838 tb = Py_None; |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2839 Py_INCREF(tb); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2840 PUSH(tb); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2841 PUSH(val); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2842 PUSH(exc); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2843 why = WHY_NOT; |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2844 JUMPTO(handler); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2845 break; |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2846 } |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2847 if (b->b_type == SETUP_FINALLY) { |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2848 if (why & (WHY_RETURN | WHY_CONTINUE)) |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2849 PUSH(retval); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2850 PUSH(PyLong_FromLong((long)why)); |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2851 why = WHY_NOT; |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2852 JUMPTO(b->b_handler); |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2853 break; |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2854 } |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2855 } /* unwind stack */ |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2856 |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2857 /* End the loop if we still have an error (or return) */ |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2858 |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2859 if (why != WHY_NOT) |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2860 break; |
|
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
|
2861 READ_TIMESTAMP(loop1); |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2862 |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2863 } /* main loop */ |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2864 |
|
31872
9f5fe6b23e59
Since the fast_yield branch target was introduced, it appears that most
Tim Peters <tim.peters@gmail.com>
parents:
31797
diff
changeset
|
2865 assert(why != WHY_YIELD); |
|
9f5fe6b23e59
Since the fast_yield branch target was introduced, it appears that most
Tim Peters <tim.peters@gmail.com>
parents:
31797
diff
changeset
|
2866 /* Pop remaining stack entries. */ |
|
9f5fe6b23e59
Since the fast_yield branch target was introduced, it appears that most
Tim Peters <tim.peters@gmail.com>
parents:
31797
diff
changeset
|
2867 while (!EMPTY()) { |
|
9f5fe6b23e59
Since the fast_yield branch target was introduced, it appears that most
Tim Peters <tim.peters@gmail.com>
parents:
31797
diff
changeset
|
2868 v = POP(); |
|
9f5fe6b23e59
Since the fast_yield branch target was introduced, it appears that most
Tim Peters <tim.peters@gmail.com>
parents:
31797
diff
changeset
|
2869 Py_XDECREF(v); |
|
21270
97709fd8fda0
Fix for SF bug #489671 (Neil Norwitz): memory leak in test_richcmp.
Guido van Rossum <guido@python.org>
parents:
21252
diff
changeset
|
2870 } |
|
97709fd8fda0
Fix for SF bug #489671 (Neil Norwitz): memory leak in test_richcmp.
Guido van Rossum <guido@python.org>
parents:
21252
diff
changeset
|
2871 |
|
31872
9f5fe6b23e59
Since the fast_yield branch target was introduced, it appears that most
Tim Peters <tim.peters@gmail.com>
parents:
31797
diff
changeset
|
2872 if (why != WHY_RETURN) |
| 567 | 2873 retval = NULL; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2874 |
|
31462
d5c047807c69
SF patch #864059: optimize eval_frame
Raymond Hettinger <python@rcn.com>
parents:
30979
diff
changeset
|
2875 fast_yield: |
|
18374
3b295ce2705f
This change adjusts the profiling/tracing support so that the common
Fred Drake <fdrake@acm.org>
parents:
18326
diff
changeset
|
2876 if (tstate->use_tracing) { |
|
35345
700f08369092
Port from the Python 2.4 branch, patches for SF bug # 900092,
Barry Warsaw <barry@python.org>
parents:
35298
diff
changeset
|
2877 if (tstate->c_tracefunc) { |
|
700f08369092
Port from the Python 2.4 branch, patches for SF bug # 900092,
Barry Warsaw <barry@python.org>
parents:
35298
diff
changeset
|
2878 if (why == WHY_RETURN || why == WHY_YIELD) { |
|
700f08369092
Port from the Python 2.4 branch, patches for SF bug # 900092,
Barry Warsaw <barry@python.org>
parents:
35298
diff
changeset
|
2879 if (call_trace(tstate->c_tracefunc, |
|
700f08369092
Port from the Python 2.4 branch, patches for SF bug # 900092,
Barry Warsaw <barry@python.org>
parents:
35298
diff
changeset
|
2880 tstate->c_traceobj, f, |
|
700f08369092
Port from the Python 2.4 branch, patches for SF bug # 900092,
Barry Warsaw <barry@python.org>
parents:
35298
diff
changeset
|
2881 PyTrace_RETURN, retval)) { |
|
700f08369092
Port from the Python 2.4 branch, patches for SF bug # 900092,
Barry Warsaw <barry@python.org>
parents:
35298
diff
changeset
|
2882 Py_XDECREF(retval); |
|
700f08369092
Port from the Python 2.4 branch, patches for SF bug # 900092,
Barry Warsaw <barry@python.org>
parents:
35298
diff
changeset
|
2883 retval = NULL; |
|
700f08369092
Port from the Python 2.4 branch, patches for SF bug # 900092,
Barry Warsaw <barry@python.org>
parents:
35298
diff
changeset
|
2884 why = WHY_EXCEPTION; |
|
700f08369092
Port from the Python 2.4 branch, patches for SF bug # 900092,
Barry Warsaw <barry@python.org>
parents:
35298
diff
changeset
|
2885 } |
|
700f08369092
Port from the Python 2.4 branch, patches for SF bug # 900092,
Barry Warsaw <barry@python.org>
parents:
35298
diff
changeset
|
2886 } |
|
700f08369092
Port from the Python 2.4 branch, patches for SF bug # 900092,
Barry Warsaw <barry@python.org>
parents:
35298
diff
changeset
|
2887 else if (why == WHY_EXCEPTION) { |
|
700f08369092
Port from the Python 2.4 branch, patches for SF bug # 900092,
Barry Warsaw <barry@python.org>
parents:
35298
diff
changeset
|
2888 call_trace_protected(tstate->c_tracefunc, |
|
700f08369092
Port from the Python 2.4 branch, patches for SF bug # 900092,
Barry Warsaw <barry@python.org>
parents:
35298
diff
changeset
|
2889 tstate->c_traceobj, f, |
|
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
|
2890 PyTrace_RETURN, NULL); |
| 567 | 2891 } |
| 2892 } | |
|
20247
a4d328d50897
Rationalize the events passed to the profiler (no changes for the tracer).
Fred Drake <fdrake@acm.org>
parents:
20183
diff
changeset
|
2893 if (tstate->c_profilefunc) { |
|
20257
e3f63a95455f
Fix bug in profiler modifications detected only in debug builds.
Fred Drake <fdrake@acm.org>
parents:
20247
diff
changeset
|
2894 if (why == WHY_EXCEPTION) |
|
e3f63a95455f
Fix bug in profiler modifications detected only in debug builds.
Fred Drake <fdrake@acm.org>
parents:
20247
diff
changeset
|
2895 call_trace_protected(tstate->c_profilefunc, |
|
e3f63a95455f
Fix bug in profiler modifications detected only in debug builds.
Fred Drake <fdrake@acm.org>
parents:
20247
diff
changeset
|
2896 tstate->c_profileobj, f, |
|
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
|
2897 PyTrace_RETURN, NULL); |
|
20257
e3f63a95455f
Fix bug in profiler modifications detected only in debug builds.
Fred Drake <fdrake@acm.org>
parents:
20247
diff
changeset
|
2898 else if (call_trace(tstate->c_profilefunc, |
|
e3f63a95455f
Fix bug in profiler modifications detected only in debug builds.
Fred Drake <fdrake@acm.org>
parents:
20247
diff
changeset
|
2899 tstate->c_profileobj, f, |
|
e3f63a95455f
Fix bug in profiler modifications detected only in debug builds.
Fred Drake <fdrake@acm.org>
parents:
20247
diff
changeset
|
2900 PyTrace_RETURN, retval)) { |
|
18374
3b295ce2705f
This change adjusts the profiling/tracing support so that the common
Fred Drake <fdrake@acm.org>
parents:
18326
diff
changeset
|
2901 Py_XDECREF(retval); |
|
3b295ce2705f
This change adjusts the profiling/tracing support so that the common
Fred Drake <fdrake@acm.org>
parents:
18326
diff
changeset
|
2902 retval = NULL; |
|
3b295ce2705f
This change adjusts the profiling/tracing support so that the common
Fred Drake <fdrake@acm.org>
parents:
18326
diff
changeset
|
2903 why = WHY_EXCEPTION; |
|
3b295ce2705f
This change adjusts the profiling/tracing support so that the common
Fred Drake <fdrake@acm.org>
parents:
18326
diff
changeset
|
2904 } |
|
708
8bcb50f436fa
New trace implementation; and profile (in a similat vein).
Guido van Rossum <guido@python.org>
parents:
688
diff
changeset
|
2905 } |
| 567 | 2906 } |
|
5023
75c1ee882a4a
Kill all local variables on function return. This closes a gigantic
Guido van Rossum <guido@python.org>
parents:
5021
diff
changeset
|
2907 |
|
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
|
2908 /* pop frame */ |
|
43410
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
2909 exit_eval_frame: |
|
30801
c42c40034536
Deleting cyclic object comparison.
Armin Rigo <arigo@tunes.org>
parents:
30782
diff
changeset
|
2910 Py_LeaveRecursiveCall(); |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5368
diff
changeset
|
2911 tstate->frame = f->f_back; |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
2912 |
| 567 | 2913 return retval; |
|
173
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2914 } |
|
4656452436e1
Moved support functions after main function; added prototypes;
Guido van Rossum <guido@python.org>
parents:
159
diff
changeset
|
2915 |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36580
diff
changeset
|
2916 /* 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
|
2917 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
|
2918 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
|
2919 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18611
diff
changeset
|
2920 PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18611
diff
changeset
|
2921 PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals, |
|
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
|
2922 PyObject **args, int argcount, PyObject **kws, int kwcount, |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
2923 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
|
2924 { |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2925 register PyFrameObject *f; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2926 register PyObject *retval = NULL; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2927 register PyObject **fastlocals, **freevars; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2928 PyThreadState *tstate = PyThreadState_GET(); |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2929 PyObject *x, *u; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2930 |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2931 if (globals == NULL) { |
|
31872
9f5fe6b23e59
Since the fast_yield branch target was introduced, it appears that most
Tim Peters <tim.peters@gmail.com>
parents:
31797
diff
changeset
|
2932 PyErr_SetString(PyExc_SystemError, |
|
19198
3c1c9948ff65
Remove much dead code from ceval.c
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19158
diff
changeset
|
2933 "PyEval_EvalCodeEx: NULL globals"); |
|
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
|
2934 return NULL; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2935 } |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2936 |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39536
diff
changeset
|
2937 assert(tstate != NULL); |
|
27712
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
2938 assert(globals != NULL); |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
2939 f = PyFrame_New(tstate, co, globals, locals); |
|
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
|
2940 if (f == NULL) |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2941 return NULL; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2942 |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2943 fastlocals = f->f_localsplus; |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
2944 freevars = f->f_localsplus + co->co_nlocals; |
|
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
|
2945 |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2946 if (co->co_argcount > 0 || |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
2947 co->co_kwonlyargcount > 0 || |
|
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
|
2948 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) { |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2949 int i; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2950 int n = argcount; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2951 PyObject *kwdict = NULL; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2952 if (co->co_flags & CO_VARKEYWORDS) { |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2953 kwdict = PyDict_New(); |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2954 if (kwdict == NULL) |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2955 goto fail; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
2956 i = co->co_argcount + co->co_kwonlyargcount; |
|
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
|
2957 if (co->co_flags & CO_VARARGS) |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2958 i++; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2959 SETLOCAL(i, kwdict); |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2960 } |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2961 if (argcount > co->co_argcount) { |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2962 if (!(co->co_flags & CO_VARARGS)) { |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2963 PyErr_Format(PyExc_TypeError, |
|
43569
19319e70fc3e
Patch #1272, by Christian Heimes and Alexandre Vassalotti.
Guido van Rossum <guido@python.org>
parents:
43418
diff
changeset
|
2964 "%U() takes %s %d " |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
2965 "%spositional argument%s (%d given)", |
|
41878
089f449a20cd
Change PyErr_Format() to generate a unicode string (by using
Walter Dörwald <walter@livinglogic.de>
parents:
41824
diff
changeset
|
2966 co->co_name, |
|
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
|
2967 defcount ? "at most" : "exactly", |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2968 co->co_argcount, |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2969 kwcount ? "non-keyword " : "", |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2970 co->co_argcount == 1 ? "" : "s", |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2971 argcount); |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2972 goto fail; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2973 } |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2974 n = co->co_argcount; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2975 } |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2976 for (i = 0; i < n; i++) { |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2977 x = args[i]; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2978 Py_INCREF(x); |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2979 SETLOCAL(i, x); |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2980 } |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2981 if (co->co_flags & CO_VARARGS) { |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2982 u = PyTuple_New(argcount - n); |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2983 if (u == NULL) |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2984 goto fail; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
2985 SETLOCAL(co->co_argcount + co->co_kwonlyargcount, u); |
|
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
|
2986 for (i = n; i < argcount; i++) { |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2987 x = args[i]; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2988 Py_INCREF(x); |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2989 PyTuple_SET_ITEM(u, i-n, x); |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2990 } |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2991 } |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2992 for (i = 0; i < kwcount; i++) { |
|
48574
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
2993 PyObject **co_varnames; |
|
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
|
2994 PyObject *keyword = kws[2*i]; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2995 PyObject *value = kws[2*i + 1]; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
2996 int j; |
| 42860 | 2997 if (keyword == NULL || !PyUnicode_Check(keyword)) { |
|
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
|
2998 PyErr_Format(PyExc_TypeError, |
|
43569
19319e70fc3e
Patch #1272, by Christian Heimes and Alexandre Vassalotti.
Guido van Rossum <guido@python.org>
parents:
43418
diff
changeset
|
2999 "%U() keywords must be strings", |
|
41878
089f449a20cd
Change PyErr_Format() to generate a unicode string (by using
Walter Dörwald <walter@livinglogic.de>
parents:
41824
diff
changeset
|
3000 co->co_name); |
|
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
|
3001 goto fail; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3002 } |
|
48574
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
3003 /* Speed hack: do raw pointer compares. As names are |
|
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
3004 normally interned this should almost always hit. */ |
|
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
3005 co_varnames = PySequence_Fast_ITEMS(co->co_varnames); |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
3006 for (j = 0; |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
3007 j < co->co_argcount + co->co_kwonlyargcount; |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
3008 j++) { |
|
48574
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
3009 PyObject *nm = co_varnames[j]; |
|
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
3010 if (nm == keyword) |
|
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
3011 goto kw_found; |
|
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
3012 } |
|
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
3013 /* Slow fallback, just in case */ |
|
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
3014 for (j = 0; |
|
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
3015 j < co->co_argcount + co->co_kwonlyargcount; |
|
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
3016 j++) { |
|
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
3017 PyObject *nm = co_varnames[j]; |
|
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
|
3018 int cmp = PyObject_RichCompareBool( |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3019 keyword, nm, Py_EQ); |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3020 if (cmp > 0) |
|
48574
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
3021 goto kw_found; |
|
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
|
3022 else if (cmp < 0) |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3023 goto fail; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3024 } |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3025 /* Check errors from Compare */ |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3026 if (PyErr_Occurred()) |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3027 goto fail; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
3028 if (j >= co->co_argcount + co->co_kwonlyargcount) { |
|
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
|
3029 if (kwdict == NULL) { |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3030 PyErr_Format(PyExc_TypeError, |
|
43569
19319e70fc3e
Patch #1272, by Christian Heimes and Alexandre Vassalotti.
Guido van Rossum <guido@python.org>
parents:
43418
diff
changeset
|
3031 "%U() got an unexpected " |
|
41878
089f449a20cd
Change PyErr_Format() to generate a unicode string (by using
Walter Dörwald <walter@livinglogic.de>
parents:
41824
diff
changeset
|
3032 "keyword argument '%S'", |
|
089f449a20cd
Change PyErr_Format() to generate a unicode string (by using
Walter Dörwald <walter@livinglogic.de>
parents:
41824
diff
changeset
|
3033 co->co_name, |
|
089f449a20cd
Change PyErr_Format() to generate a unicode string (by using
Walter Dörwald <walter@livinglogic.de>
parents:
41824
diff
changeset
|
3034 keyword); |
|
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
|
3035 goto fail; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3036 } |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3037 PyDict_SetItem(kwdict, keyword, value); |
|
48574
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
3038 continue; |
|
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
|
3039 } |
|
48574
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
3040 kw_found: |
|
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
3041 if (GETLOCAL(j) != NULL) { |
|
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
3042 PyErr_Format(PyExc_TypeError, |
|
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
3043 "%U() got multiple " |
|
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
3044 "values for keyword " |
|
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
3045 "argument '%S'", |
|
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
3046 co->co_name, |
|
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
3047 keyword); |
|
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
3048 goto fail; |
|
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
|
3049 } |
|
48574
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
3050 Py_INCREF(value); |
|
d3d586019aff
Merged revisions 65240-65242 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48516
diff
changeset
|
3051 SETLOCAL(j, value); |
|
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
|
3052 } |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
3053 if (co->co_kwonlyargcount > 0) { |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
3054 for (i = co->co_argcount; |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
3055 i < co->co_argcount + co->co_kwonlyargcount; |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
3056 i++) { |
|
40381
259d26900861
Make it compile with older compilers.
Guido van Rossum <guido@python.org>
parents:
40215
diff
changeset
|
3057 PyObject *name, *def; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
3058 if (GETLOCAL(i) != NULL) |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
3059 continue; |
|
40381
259d26900861
Make it compile with older compilers.
Guido van Rossum <guido@python.org>
parents:
40215
diff
changeset
|
3060 name = PyTuple_GET_ITEM(co->co_varnames, i); |
|
259d26900861
Make it compile with older compilers.
Guido van Rossum <guido@python.org>
parents:
40215
diff
changeset
|
3061 def = NULL; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
3062 if (kwdefs != NULL) |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
3063 def = PyDict_GetItem(kwdefs, name); |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
3064 if (def != NULL) { |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
3065 Py_INCREF(def); |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
3066 SETLOCAL(i, def); |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
3067 continue; |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
3068 } |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
3069 PyErr_Format(PyExc_TypeError, |
|
43569
19319e70fc3e
Patch #1272, by Christian Heimes and Alexandre Vassalotti.
Guido van Rossum <guido@python.org>
parents:
43418
diff
changeset
|
3070 "%U() needs keyword-only argument %S", |
|
41878
089f449a20cd
Change PyErr_Format() to generate a unicode string (by using
Walter Dörwald <walter@livinglogic.de>
parents:
41824
diff
changeset
|
3071 co->co_name, name); |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
3072 goto fail; |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
3073 } |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
3074 } |
|
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
|
3075 if (argcount < co->co_argcount) { |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3076 int m = co->co_argcount - defcount; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3077 for (i = argcount; i < m; i++) { |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3078 if (GETLOCAL(i) == NULL) { |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3079 PyErr_Format(PyExc_TypeError, |
|
43569
19319e70fc3e
Patch #1272, by Christian Heimes and Alexandre Vassalotti.
Guido van Rossum <guido@python.org>
parents:
43418
diff
changeset
|
3080 "%U() takes %s %d " |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
3081 "%spositional argument%s " |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
3082 "(%d given)", |
|
41878
089f449a20cd
Change PyErr_Format() to generate a unicode string (by using
Walter Dörwald <walter@livinglogic.de>
parents:
41824
diff
changeset
|
3083 co->co_name, |
|
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
|
3084 ((co->co_flags & CO_VARARGS) || |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3085 defcount) ? "at least" |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3086 : "exactly", |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3087 m, kwcount ? "non-keyword " : "", |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3088 m == 1 ? "" : "s", i); |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3089 goto fail; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3090 } |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3091 } |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3092 if (n > m) |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3093 i = n - m; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3094 else |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3095 i = 0; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3096 for (; i < defcount; i++) { |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3097 if (GETLOCAL(m+i) == NULL) { |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3098 PyObject *def = defs[i]; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3099 Py_INCREF(def); |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3100 SETLOCAL(m+i, def); |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3101 } |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3102 } |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3103 } |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3104 } |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3105 else { |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3106 if (argcount > 0 || kwcount > 0) { |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3107 PyErr_Format(PyExc_TypeError, |
|
43569
19319e70fc3e
Patch #1272, by Christian Heimes and Alexandre Vassalotti.
Guido van Rossum <guido@python.org>
parents:
43418
diff
changeset
|
3108 "%U() takes no arguments (%d given)", |
|
41878
089f449a20cd
Change PyErr_Format() to generate a unicode string (by using
Walter Dörwald <walter@livinglogic.de>
parents:
41824
diff
changeset
|
3109 co->co_name, |
|
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
|
3110 argcount + kwcount); |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3111 goto fail; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3112 } |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3113 } |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3114 /* Allocate and initialize storage for cell vars, and copy free |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3115 vars into frame. This isn't too efficient right now. */ |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
3116 if (PyTuple_GET_SIZE(co->co_cellvars)) { |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
39222
diff
changeset
|
3117 int i, j, nargs, found; |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41969
diff
changeset
|
3118 Py_UNICODE *cellname, *argname; |
|
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
|
3119 PyObject *c; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3120 |
|
43996
b86e6bf7438f
fix #1409: cell variables were not initialized,
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
43840
diff
changeset
|
3121 nargs = co->co_argcount + co->co_kwonlyargcount; |
|
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
|
3122 if (co->co_flags & CO_VARARGS) |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3123 nargs++; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3124 if (co->co_flags & CO_VARKEYWORDS) |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3125 nargs++; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3126 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35609
diff
changeset
|
3127 /* Initialize each cell var, taking into account |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35609
diff
changeset
|
3128 cell vars that are initialized from arguments. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35609
diff
changeset
|
3129 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35609
diff
changeset
|
3130 Should arrange for the compiler to put cellvars |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35609
diff
changeset
|
3131 that are arguments at the beginning of the cellvars |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35609
diff
changeset
|
3132 list so that we can march over it more efficiently? |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35609
diff
changeset
|
3133 */ |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
3134 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) { |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41969
diff
changeset
|
3135 cellname = PyUnicode_AS_UNICODE( |
|
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
|
3136 PyTuple_GET_ITEM(co->co_cellvars, i)); |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3137 found = 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35609
diff
changeset
|
3138 for (j = 0; j < nargs; j++) { |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41969
diff
changeset
|
3139 argname = PyUnicode_AS_UNICODE( |
|
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
|
3140 PyTuple_GET_ITEM(co->co_varnames, j)); |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41969
diff
changeset
|
3141 if (Py_UNICODE_strcmp(cellname, argname) == 0) { |
|
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
|
3142 c = PyCell_New(GETLOCAL(j)); |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3143 if (c == NULL) |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3144 goto fail; |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
3145 GETLOCAL(co->co_nlocals + i) = c; |
|
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
|
3146 found = 1; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3147 break; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3148 } |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3149 } |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3150 if (found == 0) { |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3151 c = PyCell_New(NULL); |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3152 if (c == NULL) |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3153 goto fail; |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
3154 SETLOCAL(co->co_nlocals + i, c); |
|
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
|
3155 } |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3156 } |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3157 } |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
3158 if (PyTuple_GET_SIZE(co->co_freevars)) { |
|
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
|
3159 int i; |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
3160 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) { |
|
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
|
3161 PyObject *o = PyTuple_GET_ITEM(closure, i); |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3162 Py_INCREF(o); |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
3163 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o; |
|
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
|
3164 } |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3165 } |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3166 |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3167 if (co->co_flags & CO_GENERATOR) { |
|
18194
990b73fa074c
Try to avoid creating reference cycles involving generators. Only keep a
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18172
diff
changeset
|
3168 /* Don't need to keep the reference to f_back, it will be set |
|
990b73fa074c
Try to avoid creating reference cycles involving generators. Only keep a
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18172
diff
changeset
|
3169 * when the generator is resumed. */ |
|
18611
fdb36a0c7e6e
Part way to allowing "from __future__ import generators" to communicate
Tim Peters <tim.peters@gmail.com>
parents:
18513
diff
changeset
|
3170 Py_XDECREF(f->f_back); |
|
18194
990b73fa074c
Try to avoid creating reference cycles involving generators. Only keep a
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18172
diff
changeset
|
3171 f->f_back = NULL; |
|
990b73fa074c
Try to avoid creating reference cycles involving generators. Only keep a
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18172
diff
changeset
|
3172 |
|
27712
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3173 PCALL(PCALL_GENERATOR); |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3174 |
|
18194
990b73fa074c
Try to avoid creating reference cycles involving generators. Only keep a
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18172
diff
changeset
|
3175 /* Create a new generator that owns the ready to run frame |
|
990b73fa074c
Try to avoid creating reference cycles involving generators. Only keep a
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18172
diff
changeset
|
3176 * and return that as the value. */ |
|
32175
8ee5a56b8031
Patch #957398: Add public API for Generator Object/Type.
Martin v. Löwis <martin@v.loewis.de>
parents:
31900
diff
changeset
|
3177 return PyGen_New(f); |
|
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
|
3178 } |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3179 |
|
43410
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
3180 retval = PyEval_EvalFrameEx(f,0); |
|
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
3181 |
|
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
3182 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
|
3183 |
|
21058
9df82c13c675
SF bug #483469: crash on unbounded recursion in __del__.
Tim Peters <tim.peters@gmail.com>
parents:
21027
diff
changeset
|
3184 /* decref'ing the frame can cause __del__ methods to get invoked, |
|
9df82c13c675
SF bug #483469: crash on unbounded recursion in __del__.
Tim Peters <tim.peters@gmail.com>
parents:
21027
diff
changeset
|
3185 which can call back into Python. While we're done with the |
|
9df82c13c675
SF bug #483469: crash on unbounded recursion in __del__.
Tim Peters <tim.peters@gmail.com>
parents:
21027
diff
changeset
|
3186 current Python frame (f), the associated C stack is still in use, |
|
9df82c13c675
SF bug #483469: crash on unbounded recursion in __del__.
Tim Peters <tim.peters@gmail.com>
parents:
21027
diff
changeset
|
3187 so recursion_depth must be boosted for the duration. |
|
9df82c13c675
SF bug #483469: crash on unbounded recursion in __del__.
Tim Peters <tim.peters@gmail.com>
parents:
21027
diff
changeset
|
3188 */ |
|
9df82c13c675
SF bug #483469: crash on unbounded recursion in __del__.
Tim Peters <tim.peters@gmail.com>
parents:
21027
diff
changeset
|
3189 assert(tstate != NULL); |
|
9df82c13c675
SF bug #483469: crash on unbounded recursion in __del__.
Tim Peters <tim.peters@gmail.com>
parents:
21027
diff
changeset
|
3190 ++tstate->recursion_depth; |
|
43410
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
3191 Py_DECREF(f); |
|
21058
9df82c13c675
SF bug #483469: crash on unbounded recursion in __del__.
Tim Peters <tim.peters@gmail.com>
parents:
21027
diff
changeset
|
3192 --tstate->recursion_depth; |
|
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
|
3193 return retval; |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3194 } |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3195 |
|
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
18136
diff
changeset
|
3196 |
|
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
|
3197 /* 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
|
3198 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
|
3199 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
|
3200 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
|
3201 { |
|
47722
7ba7901dad7f
Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents:
47594
diff
changeset
|
3202 PyObject *type = NULL, *value = NULL; |
|
43102
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3203 |
|
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3204 if (exc == NULL) { |
|
7946
ad114620f8c2
Make first raise argument optional
Guido van Rossum <guido@python.org>
parents:
7014
diff
changeset
|
3205 /* Reraise */ |
|
31797
846b3ee7e106
Changed random calls to PyThreadState_Get() to use the macro
Nicholas Bastin <nick.bastin@gmail.com>
parents:
31796
diff
changeset
|
3206 PyThreadState *tstate = PyThreadState_GET(); |
|
47722
7ba7901dad7f
Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents:
47594
diff
changeset
|
3207 PyObject *tb; |
|
43102
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3208 type = tstate->exc_type; |
|
7946
ad114620f8c2
Make first raise argument optional
Guido van Rossum <guido@python.org>
parents:
7014
diff
changeset
|
3209 value = tstate->exc_value; |
|
ad114620f8c2
Make first raise argument optional
Guido van Rossum <guido@python.org>
parents:
7014
diff
changeset
|
3210 tb = tstate->exc_traceback; |
| 43411 | 3211 if (type == Py_None) { |
| 3212 PyErr_SetString(PyExc_RuntimeError, | |
| 3213 "No active exception to reraise"); | |
| 3214 return WHY_EXCEPTION; | |
| 3215 } | |
| 3216 Py_XINCREF(type); | |
|
7946
ad114620f8c2
Make first raise argument optional
Guido van Rossum <guido@python.org>
parents:
7014
diff
changeset
|
3217 Py_XINCREF(value); |
|
ad114620f8c2
Make first raise argument optional
Guido van Rossum <guido@python.org>
parents:
7014
diff
changeset
|
3218 Py_XINCREF(tb); |
| 43411 | 3219 PyErr_Restore(type, value, tb); |
| 3220 return WHY_RERAISE; | |
|
7946
ad114620f8c2
Make first raise argument optional
Guido van Rossum <guido@python.org>
parents:
7014
diff
changeset
|
3221 } |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
3222 |
|
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
|
3223 /* We support the following forms of raise: |
|
43102
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3224 raise |
|
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3225 raise <instance> |
|
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3226 raise <type> */ |
|
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3227 |
|
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3228 if (PyExceptionClass_Check(exc)) { |
| 43411 | 3229 type = exc; |
| 3230 value = PyObject_CallObject(exc, NULL); | |
|
43102
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3231 if (value == NULL) |
| 43411 | 3232 goto raise_error; |
| 3233 } | |
|
43102
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3234 else if (PyExceptionInstance_Check(exc)) { |
|
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3235 value = exc; |
|
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3236 type = PyExceptionInstance_Class(exc); |
| 5368 | 3237 Py_INCREF(type); |
|
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
|
3238 } |
|
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
|
3239 else { |
|
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
|
3240 /* Not something you can raise. You get an exception |
|
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
|
3241 anyway, just not what you specified :-) */ |
| 43411 | 3242 Py_DECREF(exc); |
|
36988
49c6eb688906
Checkpoint. 218 tests are okay; 53 are failing. Done so far:
Guido van Rossum <guido@python.org>
parents:
36926
diff
changeset
|
3243 PyErr_SetString(PyExc_TypeError, |
| 43411 | 3244 "exceptions must derive from BaseException"); |
|
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
|
3245 goto raise_error; |
|
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
|
3246 } |
|
43102
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3247 |
| 43411 | 3248 if (cause) { |
| 3249 PyObject *fixed_cause; | |
| 3250 if (PyExceptionClass_Check(cause)) { | |
| 3251 fixed_cause = PyObject_CallObject(cause, NULL); | |
| 3252 if (fixed_cause == NULL) | |
| 3253 goto raise_error; | |
| 3254 Py_DECREF(cause); | |
| 3255 } | |
| 3256 else if (PyExceptionInstance_Check(cause)) { | |
| 3257 fixed_cause = cause; | |
| 3258 } | |
| 3259 else { | |
| 3260 PyErr_SetString(PyExc_TypeError, | |
| 3261 "exception causes must derive from " | |
| 3262 "BaseException"); | |
| 3263 goto raise_error; | |
| 3264 } | |
| 3265 PyException_SetCause(value, fixed_cause); | |
| 3266 } | |
|
43102
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3267 |
|
47722
7ba7901dad7f
Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents:
47594
diff
changeset
|
3268 PyErr_SetObject(type, value); |
|
7ba7901dad7f
Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents:
47594
diff
changeset
|
3269 /* PyErr_SetObject incref's its arguments */ |
|
7ba7901dad7f
Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents:
47594
diff
changeset
|
3270 Py_XDECREF(value); |
|
7ba7901dad7f
Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents:
47594
diff
changeset
|
3271 Py_XDECREF(type); |
|
43102
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3272 return WHY_EXCEPTION; |
|
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3273 |
|
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
3274 raise_error: |
| 5368 | 3275 Py_XDECREF(value); |
| 3276 Py_XDECREF(type); | |
|
43188
386c22d93ab6
Fix refleaks exposed by test_raise.
Collin Winter <collinw@gmail.com>
parents:
43102
diff
changeset
|
3277 Py_XDECREF(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
|
3278 return WHY_EXCEPTION; |
|
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
|
3279 } |
|
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
|
3280 |
|
18195
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
3281 /* 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
|
3282 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
|
3283 |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3284 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
|
3285 with a variable target. |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3286 */ |
|
18195
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
3287 |
|
6157
647e60fb3bac
eval_code2(): collapsed the implementations of UNPACK_TUPLE and
Barry Warsaw <barry@python.org>
parents:
6147
diff
changeset
|
3288 static int |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3289 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
|
3290 { |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3291 int i = 0, j = 0; |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3292 Py_ssize_t ll = 0; |
|
18195
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
3293 PyObject *it; /* iter(v) */ |
|
6157
647e60fb3bac
eval_code2(): collapsed the implementations of UNPACK_TUPLE and
Barry Warsaw <barry@python.org>
parents:
6147
diff
changeset
|
3294 PyObject *w; |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3295 PyObject *l = NULL; /* variable list */ |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
3296 |
|
18195
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
3297 assert(v != NULL); |
|
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
3298 |
|
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
3299 it = PyObject_GetIter(v); |
|
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
3300 if (it == NULL) |
|
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
3301 goto Error; |
|
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
3302 |
|
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
3303 for (; i < argcnt; i++) { |
|
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
3304 w = PyIter_Next(it); |
|
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
3305 if (w == NULL) { |
|
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
3306 /* Iterator done, via error or exhaustion. */ |
|
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
3307 if (!PyErr_Occurred()) { |
|
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
3308 PyErr_Format(PyExc_ValueError, |
|
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
3309 "need more than %d value%s to unpack", |
|
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
3310 i, i == 1 ? "" : "s"); |
|
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
3311 } |
|
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
3312 goto Error; |
|
6157
647e60fb3bac
eval_code2(): collapsed the implementations of UNPACK_TUPLE and
Barry Warsaw <barry@python.org>
parents:
6147
diff
changeset
|
3313 } |
|
647e60fb3bac
eval_code2(): collapsed the implementations of UNPACK_TUPLE and
Barry Warsaw <barry@python.org>
parents:
6147
diff
changeset
|
3314 *--sp = w; |
|
647e60fb3bac
eval_code2(): collapsed the implementations of UNPACK_TUPLE and
Barry Warsaw <barry@python.org>
parents:
6147
diff
changeset
|
3315 } |
|
18195
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
3316 |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3317 if (argcntafter == -1) { |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3318 /* We better have exhausted the iterator now. */ |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3319 w = PyIter_Next(it); |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3320 if (w == NULL) { |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3321 if (PyErr_Occurred()) |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3322 goto Error; |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3323 Py_DECREF(it); |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3324 return 1; |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3325 } |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3326 Py_DECREF(w); |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3327 PyErr_SetString(PyExc_ValueError, "too many values to unpack"); |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3328 goto Error; |
|
6157
647e60fb3bac
eval_code2(): collapsed the implementations of UNPACK_TUPLE and
Barry Warsaw <barry@python.org>
parents:
6147
diff
changeset
|
3329 } |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3330 |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3331 l = PySequence_List(it); |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3332 if (l == NULL) |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3333 goto Error; |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3334 *--sp = l; |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3335 i++; |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3336 |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3337 ll = PyList_GET_SIZE(l); |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3338 if (ll < argcntafter) { |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3339 PyErr_Format(PyExc_ValueError, "need more than %zd values to unpack", |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3340 argcnt + ll); |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3341 goto Error; |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3342 } |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3343 |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3344 /* Pop the "after-variable" args off the list. */ |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3345 for (j = argcntafter; j > 0; j--, i++) { |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3346 *--sp = PyList_GET_ITEM(l, ll - j); |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3347 } |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3348 /* Resize the list. */ |
|
44351
86a2679dca46
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT.
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
3349 Py_SIZE(l) = ll - argcntafter; |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3350 Py_DECREF(it); |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3351 return 1; |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41558
diff
changeset
|
3352 |
|
18195
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
3353 Error: |
|
6160
79592761b331
unpack_sequence(): In finally clause, watch out for Py_DECREF
Barry Warsaw <barry@python.org>
parents:
6157
diff
changeset
|
3354 for (; i > 0; i--, sp++) |
|
79592761b331
unpack_sequence(): In finally clause, watch out for Py_DECREF
Barry Warsaw <barry@python.org>
parents:
6157
diff
changeset
|
3355 Py_DECREF(*sp); |
|
18195
36e825660a24
Teach the UNPACK_SEQUENCE opcode how to tease an iterable object into
Tim Peters <tim.peters@gmail.com>
parents:
18194
diff
changeset
|
3356 Py_XDECREF(it); |
|
6157
647e60fb3bac
eval_code2(): collapsed the implementations of UNPACK_TUPLE and
Barry Warsaw <barry@python.org>
parents:
6147
diff
changeset
|
3357 return 0; |
|
647e60fb3bac
eval_code2(): collapsed the implementations of UNPACK_TUPLE and
Barry Warsaw <barry@python.org>
parents:
6147
diff
changeset
|
3358 } |
|
647e60fb3bac
eval_code2(): collapsed the implementations of UNPACK_TUPLE and
Barry Warsaw <barry@python.org>
parents:
6147
diff
changeset
|
3359 |
|
647e60fb3bac
eval_code2(): collapsed the implementations of UNPACK_TUPLE and
Barry Warsaw <barry@python.org>
parents:
6147
diff
changeset
|
3360 |
| 567 | 3361 #ifdef LLTRACE |
| 86 | 3362 static int |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
3363 prtrace(PyObject *v, char *str) |
| 69 | 3364 { |
| 86 | 3365 printf("%s ", str); |
| 5368 | 3366 if (PyObject_Print(v, stdout, 0) != 0) |
| 3367 PyErr_Clear(); /* Don't know what else to do */ | |
| 86 | 3368 printf("\n"); |
|
12579
978253542076
Add useless 'return 1' to prtrace() to shut up VC++.
Guido van Rossum <guido@python.org>
parents:
12576
diff
changeset
|
3369 return 1; |
| 69 | 3370 } |
| 86 | 3371 #endif |
| 69 | 3372 |
|
708
8bcb50f436fa
New trace implementation; and profile (in a similat vein).
Guido van Rossum <guido@python.org>
parents:
688
diff
changeset
|
3373 static void |
|
18326
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3374 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
|
3375 { |
| 5368 | 3376 PyObject *type, *value, *traceback, *arg; |
|
708
8bcb50f436fa
New trace implementation; and profile (in a similat vein).
Guido van Rossum <guido@python.org>
parents:
688
diff
changeset
|
3377 int err; |
| 5368 | 3378 PyErr_Fetch(&type, &value, &traceback); |
|
815
6508c93f9472
Test for NULL coming out of err_get() in call_exc_trace()
Guido van Rossum <guido@python.org>
parents:
814
diff
changeset
|
3379 if (value == NULL) { |
| 5368 | 3380 value = Py_None; |
| 3381 Py_INCREF(value); | |
|
815
6508c93f9472
Test for NULL coming out of err_get() in call_exc_trace()
Guido van Rossum <guido@python.org>
parents:
814
diff
changeset
|
3382 } |
|
30683
3b59fa5d25b1
Simplify and speedup uses of Py_BuildValue():
Raymond Hettinger <python@rcn.com>
parents:
29669
diff
changeset
|
3383 arg = PyTuple_Pack(3, type, value, traceback); |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2006
diff
changeset
|
3384 if (arg == NULL) { |
| 5368 | 3385 PyErr_Restore(type, value, traceback); |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2006
diff
changeset
|
3386 return; |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2006
diff
changeset
|
3387 } |
|
18326
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3388 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg); |
| 5368 | 3389 Py_DECREF(arg); |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2006
diff
changeset
|
3390 if (err == 0) |
| 5368 | 3391 PyErr_Restore(type, value, traceback); |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2006
diff
changeset
|
3392 else { |
| 5368 | 3393 Py_XDECREF(type); |
| 3394 Py_XDECREF(value); | |
| 3395 Py_XDECREF(traceback); | |
|
708
8bcb50f436fa
New trace implementation; and profile (in a similat vein).
Guido van Rossum <guido@python.org>
parents:
688
diff
changeset
|
3396 } |
|
8bcb50f436fa
New trace implementation; and profile (in a similat vein).
Guido van Rossum <guido@python.org>
parents:
688
diff
changeset
|
3397 } |
|
8bcb50f436fa
New trace implementation; and profile (in a similat vein).
Guido van Rossum <guido@python.org>
parents:
688
diff
changeset
|
3398 |
|
43840
73c8e27eb9ce
Correction for issue1265 (pdb bug with "with" statement).
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
43815
diff
changeset
|
3399 static int |
|
20257
e3f63a95455f
Fix bug in profiler modifications detected only in debug builds.
Fred Drake <fdrake@acm.org>
parents:
20247
diff
changeset
|
3400 call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame, |
|
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
|
3401 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
|
3402 { |
|
e3f63a95455f
Fix bug in profiler modifications detected only in debug builds.
Fred Drake <fdrake@acm.org>
parents:
20247
diff
changeset
|
3403 PyObject *type, *value, *traceback; |
|
e3f63a95455f
Fix bug in profiler modifications detected only in debug builds.
Fred Drake <fdrake@acm.org>
parents:
20247
diff
changeset
|
3404 int err; |
|
e3f63a95455f
Fix bug in profiler modifications detected only in debug builds.
Fred Drake <fdrake@acm.org>
parents:
20247
diff
changeset
|
3405 PyErr_Fetch(&type, &value, &traceback); |
|
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
|
3406 err = call_trace(func, obj, frame, what, arg); |
|
20257
e3f63a95455f
Fix bug in profiler modifications detected only in debug builds.
Fred Drake <fdrake@acm.org>
parents:
20247
diff
changeset
|
3407 if (err == 0) |
|
43840
73c8e27eb9ce
Correction for issue1265 (pdb bug with "with" statement).
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
43815
diff
changeset
|
3408 { |
|
20257
e3f63a95455f
Fix bug in profiler modifications detected only in debug builds.
Fred Drake <fdrake@acm.org>
parents:
20247
diff
changeset
|
3409 PyErr_Restore(type, value, traceback); |
|
43840
73c8e27eb9ce
Correction for issue1265 (pdb bug with "with" statement).
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
43815
diff
changeset
|
3410 return 0; |
|
73c8e27eb9ce
Correction for issue1265 (pdb bug with "with" statement).
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
43815
diff
changeset
|
3411 } |
|
20257
e3f63a95455f
Fix bug in profiler modifications detected only in debug builds.
Fred Drake <fdrake@acm.org>
parents:
20247
diff
changeset
|
3412 else { |
|
e3f63a95455f
Fix bug in profiler modifications detected only in debug builds.
Fred Drake <fdrake@acm.org>
parents:
20247
diff
changeset
|
3413 Py_XDECREF(type); |
|
e3f63a95455f
Fix bug in profiler modifications detected only in debug builds.
Fred Drake <fdrake@acm.org>
parents:
20247
diff
changeset
|
3414 Py_XDECREF(value); |
|
e3f63a95455f
Fix bug in profiler modifications detected only in debug builds.
Fred Drake <fdrake@acm.org>
parents:
20247
diff
changeset
|
3415 Py_XDECREF(traceback); |
|
43840
73c8e27eb9ce
Correction for issue1265 (pdb bug with "with" statement).
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
43815
diff
changeset
|
3416 return -1; |
|
20257
e3f63a95455f
Fix bug in profiler modifications detected only in debug builds.
Fred Drake <fdrake@acm.org>
parents:
20247
diff
changeset
|
3417 } |
|
e3f63a95455f
Fix bug in profiler modifications detected only in debug builds.
Fred Drake <fdrake@acm.org>
parents:
20247
diff
changeset
|
3418 } |
|
e3f63a95455f
Fix bug in profiler modifications detected only in debug builds.
Fred Drake <fdrake@acm.org>
parents:
20247
diff
changeset
|
3419 |
|
708
8bcb50f436fa
New trace implementation; and profile (in a similat vein).
Guido van Rossum <guido@python.org>
parents:
688
diff
changeset
|
3420 static int |
|
18326
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3421 call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame, |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3422 int what, PyObject *arg) |
| 567 | 3423 { |
|
18326
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3424 register PyThreadState *tstate = frame->f_tstate; |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3425 int result; |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3426 if (tstate->tracing) |
|
708
8bcb50f436fa
New trace implementation; and profile (in a similat vein).
Guido van Rossum <guido@python.org>
parents:
688
diff
changeset
|
3427 return 0; |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5368
diff
changeset
|
3428 tstate->tracing++; |
|
18374
3b295ce2705f
This change adjusts the profiling/tracing support so that the common
Fred Drake <fdrake@acm.org>
parents:
18326
diff
changeset
|
3429 tstate->use_tracing = 0; |
|
18326
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3430 result = func(obj, frame, what, arg); |
|
18374
3b295ce2705f
This change adjusts the profiling/tracing support so that the common
Fred Drake <fdrake@acm.org>
parents:
18326
diff
changeset
|
3431 tstate->use_tracing = ((tstate->c_tracefunc != NULL) |
|
3b295ce2705f
This change adjusts the profiling/tracing support so that the common
Fred Drake <fdrake@acm.org>
parents:
18326
diff
changeset
|
3432 || (tstate->c_profilefunc != NULL)); |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5368
diff
changeset
|
3433 tstate->tracing--; |
|
18326
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3434 return result; |
| 567 | 3435 } |
| 3436 | |
|
28556
78395e5b4782
- New function sys.call_tracing() allows pdb to debug code
Guido van Rossum <guido@python.org>
parents:
28304
diff
changeset
|
3437 PyObject * |
|
78395e5b4782
- New function sys.call_tracing() allows pdb to debug code
Guido van Rossum <guido@python.org>
parents:
28304
diff
changeset
|
3438 _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
|
3439 { |
|
78395e5b4782
- New function sys.call_tracing() allows pdb to debug code
Guido van Rossum <guido@python.org>
parents:
28304
diff
changeset
|
3440 PyFrameObject *frame = PyEval_GetFrame(); |
|
78395e5b4782
- New function sys.call_tracing() allows pdb to debug code
Guido van Rossum <guido@python.org>
parents:
28304
diff
changeset
|
3441 PyThreadState *tstate = frame->f_tstate; |
|
78395e5b4782
- New function sys.call_tracing() allows pdb to debug code
Guido van Rossum <guido@python.org>
parents:
28304
diff
changeset
|
3442 int save_tracing = tstate->tracing; |
|
78395e5b4782
- New function sys.call_tracing() allows pdb to debug code
Guido van Rossum <guido@python.org>
parents:
28304
diff
changeset
|
3443 int save_use_tracing = tstate->use_tracing; |
|
78395e5b4782
- New function sys.call_tracing() allows pdb to debug code
Guido van Rossum <guido@python.org>
parents:
28304
diff
changeset
|
3444 PyObject *result; |
|
78395e5b4782
- New function sys.call_tracing() allows pdb to debug code
Guido van Rossum <guido@python.org>
parents:
28304
diff
changeset
|
3445 |
|
78395e5b4782
- New function sys.call_tracing() allows pdb to debug code
Guido van Rossum <guido@python.org>
parents:
28304
diff
changeset
|
3446 tstate->tracing = 0; |
|
78395e5b4782
- New function sys.call_tracing() allows pdb to debug code
Guido van Rossum <guido@python.org>
parents:
28304
diff
changeset
|
3447 tstate->use_tracing = ((tstate->c_tracefunc != NULL) |
|
78395e5b4782
- New function sys.call_tracing() allows pdb to debug code
Guido van Rossum <guido@python.org>
parents:
28304
diff
changeset
|
3448 || (tstate->c_profilefunc != NULL)); |
|
78395e5b4782
- New function sys.call_tracing() allows pdb to debug code
Guido van Rossum <guido@python.org>
parents:
28304
diff
changeset
|
3449 result = PyObject_Call(func, args, NULL); |
|
78395e5b4782
- New function sys.call_tracing() allows pdb to debug code
Guido van Rossum <guido@python.org>
parents:
28304
diff
changeset
|
3450 tstate->tracing = save_tracing; |
|
78395e5b4782
- New function sys.call_tracing() allows pdb to debug code
Guido van Rossum <guido@python.org>
parents:
28304
diff
changeset
|
3451 tstate->use_tracing = save_use_tracing; |
|
78395e5b4782
- New function sys.call_tracing() allows pdb to debug code
Guido van Rossum <guido@python.org>
parents:
28304
diff
changeset
|
3452 return result; |
|
78395e5b4782
- New function sys.call_tracing() allows pdb to debug code
Guido van Rossum <guido@python.org>
parents:
28304
diff
changeset
|
3453 } |
|
78395e5b4782
- New function sys.call_tracing() allows pdb to debug code
Guido van Rossum <guido@python.org>
parents:
28304
diff
changeset
|
3454 |
|
26110
964d6b79c22e
This is Richie Hindle's patch:
Michael W. Hudson <mwh@python.net>
parents:
26109
diff
changeset
|
3455 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
|
3456 maybe_call_line_trace(Py_tracefunc func, PyObject *obj, |
| 31768 | 3457 PyFrameObject *frame, int *instr_lb, int *instr_ub, |
| 3458 int *instr_prev) | |
| 24844 | 3459 { |
|
26110
964d6b79c22e
This is Richie Hindle's patch:
Michael W. Hudson <mwh@python.net>
parents:
26109
diff
changeset
|
3460 int result = 0; |
|
964d6b79c22e
This is Richie Hindle's patch:
Michael W. Hudson <mwh@python.net>
parents:
26109
diff
changeset
|
3461 |
|
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
|
3462 /* If the last instruction executed isn't in the current |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37056
diff
changeset
|
3463 instruction window, reset the window. If the last |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37056
diff
changeset
|
3464 instruction happens to fall at the start of a line or if it |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37056
diff
changeset
|
3465 represents a jump backwards, call the trace function. |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37056
diff
changeset
|
3466 */ |
|
25078
be2868a63ed5
Further SET_LINENO reomval fixes. See comments in patch #587933.
Michael W. Hudson <mwh@python.net>
parents:
24978
diff
changeset
|
3467 if ((frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub)) { |
|
43410
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
3468 int line; |
|
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
3469 PyAddrPair bounds; |
|
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
3470 |
|
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
3471 line = PyCode_CheckLineNumber(frame->f_code, frame->f_lasti, |
|
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
3472 &bounds); |
|
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
3473 if (line >= 0) { |
|
25207
1e46da1e6522
A slight change to SET_LINENO-less tracing.
Michael W. Hudson <mwh@python.net>
parents:
25109
diff
changeset
|
3474 frame->f_lineno = line; |
|
31872
9f5fe6b23e59
Since the fast_yield branch target was introduced, it appears that most
Tim Peters <tim.peters@gmail.com>
parents:
31797
diff
changeset
|
3475 result = call_trace(func, obj, frame, |
|
26110
964d6b79c22e
This is Richie Hindle's patch:
Michael W. Hudson <mwh@python.net>
parents:
26109
diff
changeset
|
3476 PyTrace_LINE, Py_None); |
|
43410
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
3477 } |
|
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
3478 *instr_lb = bounds.ap_lower; |
|
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
3479 *instr_ub = bounds.ap_upper; |
| 24844 | 3480 } |
| 31768 | 3481 else if (frame->f_lasti <= *instr_prev) { |
|
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
|
3482 result = call_trace(func, obj, frame, PyTrace_LINE, Py_None); |
| 31768 | 3483 } |
| 3484 *instr_prev = frame->f_lasti; | |
|
26110
964d6b79c22e
This is Richie Hindle's patch:
Michael W. Hudson <mwh@python.net>
parents:
26109
diff
changeset
|
3485 return result; |
| 24844 | 3486 } |
| 3487 | |
|
18326
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3488 void |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3489 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
|
3490 { |
|
31797
846b3ee7e106
Changed random calls to PyThreadState_Get() to use the macro
Nicholas Bastin <nick.bastin@gmail.com>
parents:
31796
diff
changeset
|
3491 PyThreadState *tstate = PyThreadState_GET(); |
|
18326
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3492 PyObject *temp = tstate->c_profileobj; |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3493 Py_XINCREF(arg); |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3494 tstate->c_profilefunc = NULL; |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3495 tstate->c_profileobj = NULL; |
|
35125
cdec978b916c
Add comments about PyThreadState and the usage of its fields.
Brett Cannon <bcannon@gmail.com>
parents:
34863
diff
changeset
|
3496 /* Must make sure that tracing is not ignored if 'temp' is freed */ |
|
18374
3b295ce2705f
This change adjusts the profiling/tracing support so that the common
Fred Drake <fdrake@acm.org>
parents:
18326
diff
changeset
|
3497 tstate->use_tracing = 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
|
3498 Py_XDECREF(temp); |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3499 tstate->c_profilefunc = func; |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3500 tstate->c_profileobj = arg; |
|
35125
cdec978b916c
Add comments about PyThreadState and the usage of its fields.
Brett Cannon <bcannon@gmail.com>
parents:
34863
diff
changeset
|
3501 /* Flag that tracing or profiling is turned on */ |
|
18374
3b295ce2705f
This change adjusts the profiling/tracing support so that the common
Fred Drake <fdrake@acm.org>
parents:
18326
diff
changeset
|
3502 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
|
3503 } |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3504 |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3505 void |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3506 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
|
3507 { |
|
31797
846b3ee7e106
Changed random calls to PyThreadState_Get() to use the macro
Nicholas Bastin <nick.bastin@gmail.com>
parents:
31796
diff
changeset
|
3508 PyThreadState *tstate = PyThreadState_GET(); |
|
18326
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3509 PyObject *temp = tstate->c_traceobj; |
|
50045
ba8fe3a40a5b
Merged revisions 67494 via svnmerge from
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
48986
diff
changeset
|
3510 _Py_TracingPossible += (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
|
3511 Py_XINCREF(arg); |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3512 tstate->c_tracefunc = NULL; |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3513 tstate->c_traceobj = NULL; |
|
35125
cdec978b916c
Add comments about PyThreadState and the usage of its fields.
Brett Cannon <bcannon@gmail.com>
parents:
34863
diff
changeset
|
3514 /* Must make sure that profiling is not ignored if 'temp' is freed */ |
|
18374
3b295ce2705f
This change adjusts the profiling/tracing support so that the common
Fred Drake <fdrake@acm.org>
parents:
18326
diff
changeset
|
3515 tstate->use_tracing = tstate->c_profilefunc != NULL; |
|
18326
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3516 Py_XDECREF(temp); |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3517 tstate->c_tracefunc = func; |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
18293
diff
changeset
|
3518 tstate->c_traceobj = arg; |
|
35125
cdec978b916c
Add comments about PyThreadState and the usage of its fields.
Brett Cannon <bcannon@gmail.com>
parents:
34863
diff
changeset
|
3519 /* Flag that tracing or profiling is turned on */ |
|
18374
3b295ce2705f
This change adjusts the profiling/tracing support so that the common
Fred Drake <fdrake@acm.org>
parents:
18326
diff
changeset
|
3520 tstate->use_tracing = ((func != NULL) |
|
3b295ce2705f
This change adjusts the profiling/tracing support so that the common
Fred Drake <fdrake@acm.org>
parents:
18326
diff
changeset
|
3521 || (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
|
3522 } |
|
4cb34314bd97
Instead of initializing & interning the strings passed to the profile
Fred Drake <fdrake@acm.org>
parents:
18128
diff
changeset
|
3523 |
| 5368 | 3524 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
3525 PyEval_GetBuiltins(void) |
|
2098
b7be0382f9ee
__builtins__ mods (and sys_checkinterval for ceval.c)
Guido van Rossum <guido@python.org>
parents:
2088
diff
changeset
|
3526 { |
|
27978
4b99a701defe
- PyEval_GetFrame() is now declared to return a PyFrameObject *
Guido van Rossum <guido@python.org>
parents:
27781
diff
changeset
|
3527 PyFrameObject *current_frame = PyEval_GetFrame(); |
|
2098
b7be0382f9ee
__builtins__ mods (and sys_checkinterval for ceval.c)
Guido van Rossum <guido@python.org>
parents:
2088
diff
changeset
|
3528 if (current_frame == NULL) |
|
31797
846b3ee7e106
Changed random calls to PyThreadState_Get() to use the macro
Nicholas Bastin <nick.bastin@gmail.com>
parents:
31796
diff
changeset
|
3529 return PyThreadState_GET()->interp->builtins; |
|
2098
b7be0382f9ee
__builtins__ mods (and sys_checkinterval for ceval.c)
Guido van Rossum <guido@python.org>
parents:
2088
diff
changeset
|
3530 else |
|
b7be0382f9ee
__builtins__ mods (and sys_checkinterval for ceval.c)
Guido van Rossum <guido@python.org>
parents:
2088
diff
changeset
|
3531 return current_frame->f_builtins; |
|
b7be0382f9ee
__builtins__ mods (and sys_checkinterval for ceval.c)
Guido van Rossum <guido@python.org>
parents:
2088
diff
changeset
|
3532 } |
|
b7be0382f9ee
__builtins__ mods (and sys_checkinterval for ceval.c)
Guido van Rossum <guido@python.org>
parents:
2088
diff
changeset
|
3533 |
| 5368 | 3534 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
3535 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
|
3536 { |
|
27978
4b99a701defe
- PyEval_GetFrame() is now declared to return a PyFrameObject *
Guido van Rossum <guido@python.org>
parents:
27781
diff
changeset
|
3537 PyFrameObject *current_frame = PyEval_GetFrame(); |
|
1263
65a1e4e9cd54
* Fixed some subtleties with fastlocals. You can no longer access
Guido van Rossum <guido@python.org>
parents:
1262
diff
changeset
|
3538 if (current_frame == NULL) |
|
65a1e4e9cd54
* Fixed some subtleties with fastlocals. You can no longer access
Guido van Rossum <guido@python.org>
parents:
1262
diff
changeset
|
3539 return NULL; |
| 5368 | 3540 PyFrame_FastToLocals(current_frame); |
|
1263
65a1e4e9cd54
* Fixed some subtleties with fastlocals. You can no longer access
Guido van Rossum <guido@python.org>
parents:
1262
diff
changeset
|
3541 return current_frame->f_locals; |
|
65a1e4e9cd54
* Fixed some subtleties with fastlocals. You can no longer access
Guido van Rossum <guido@python.org>
parents:
1262
diff
changeset
|
3542 } |
|
65a1e4e9cd54
* Fixed some subtleties with fastlocals. You can no longer access
Guido van Rossum <guido@python.org>
parents:
1262
diff
changeset
|
3543 |
| 5368 | 3544 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
3545 PyEval_GetGlobals(void) |
| 69 | 3546 { |
|
27978
4b99a701defe
- PyEval_GetFrame() is now declared to return a PyFrameObject *
Guido van Rossum <guido@python.org>
parents:
27781
diff
changeset
|
3547 PyFrameObject *current_frame = PyEval_GetFrame(); |
| 86 | 3548 if (current_frame == NULL) |
| 3549 return NULL; | |
| 3550 else | |
| 3551 return current_frame->f_globals; | |
| 69 | 3552 } |
| 3553 | |
|
27978
4b99a701defe
- PyEval_GetFrame() is now declared to return a PyFrameObject *
Guido van Rossum <guido@python.org>
parents:
27781
diff
changeset
|
3554 PyFrameObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
3555 PyEval_GetFrame(void) |
|
1846
5243fb187d36
call_object: print message before abort()
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
3556 { |
|
31797
846b3ee7e106
Changed random calls to PyThreadState_Get() to use the macro
Nicholas Bastin <nick.bastin@gmail.com>
parents:
31796
diff
changeset
|
3557 PyThreadState *tstate = PyThreadState_GET(); |
|
27978
4b99a701defe
- PyEval_GetFrame() is now declared to return a PyFrameObject *
Guido van Rossum <guido@python.org>
parents:
27781
diff
changeset
|
3558 return _PyThreadState_GetFrame(tstate); |
|
1846
5243fb187d36
call_object: print message before abort()
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
3559 } |
|
5243fb187d36
call_object: print message before abort()
Guido van Rossum <guido@python.org>
parents:
1425
diff
changeset
|
3560 |
|
2098
b7be0382f9ee
__builtins__ mods (and sys_checkinterval for ceval.c)
Guido van Rossum <guido@python.org>
parents:
2088
diff
changeset
|
3561 int |
|
18611
fdb36a0c7e6e
Part way to allowing "from __future__ import generators" to communicate
Tim Peters <tim.peters@gmail.com>
parents:
18513
diff
changeset
|
3562 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
|
3563 { |
|
27978
4b99a701defe
- PyEval_GetFrame() is now declared to return a PyFrameObject *
Guido van Rossum <guido@python.org>
parents:
27781
diff
changeset
|
3564 PyFrameObject *current_frame = PyEval_GetFrame(); |
|
27781
cc01fb654ce3
patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents:
27712
diff
changeset
|
3565 int result = cf->cf_flags != 0; |
|
18611
fdb36a0c7e6e
Part way to allowing "from __future__ import generators" to communicate
Tim Peters <tim.peters@gmail.com>
parents:
18513
diff
changeset
|
3566 |
|
fdb36a0c7e6e
Part way to allowing "from __future__ import generators" to communicate
Tim Peters <tim.peters@gmail.com>
parents:
18513
diff
changeset
|
3567 if (current_frame != NULL) { |
|
fdb36a0c7e6e
Part way to allowing "from __future__ import generators" to communicate
Tim Peters <tim.peters@gmail.com>
parents:
18513
diff
changeset
|
3568 const int codeflags = current_frame->f_code->co_flags; |
|
19350
5b6a6d7d44ae
ceval, PyEval_MergeCompilerFlags: wasn't merging in the
Tim Peters <tim.peters@gmail.com>
parents:
19301
diff
changeset
|
3569 const int compilerflags = codeflags & PyCF_MASK; |
|
5b6a6d7d44ae
ceval, PyEval_MergeCompilerFlags: wasn't merging in the
Tim Peters <tim.peters@gmail.com>
parents:
19301
diff
changeset
|
3570 if (compilerflags) { |
|
18611
fdb36a0c7e6e
Part way to allowing "from __future__ import generators" to communicate
Tim Peters <tim.peters@gmail.com>
parents:
18513
diff
changeset
|
3571 result = 1; |
|
19350
5b6a6d7d44ae
ceval, PyEval_MergeCompilerFlags: wasn't merging in the
Tim Peters <tim.peters@gmail.com>
parents:
19301
diff
changeset
|
3572 cf->cf_flags |= compilerflags; |
|
18611
fdb36a0c7e6e
Part way to allowing "from __future__ import generators" to communicate
Tim Peters <tim.peters@gmail.com>
parents:
18513
diff
changeset
|
3573 } |
|
22468
eebae4f60d05
Disable the parser hacks that enabled the "yield" keyword using a future
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
22398
diff
changeset
|
3574 #if 0 /* future keyword */ |
|
21609
3ba0f1b20320
Patch #494783: Rename cmp_op enumerators.
Martin v. Löwis <martin@v.loewis.de>
parents:
21537
diff
changeset
|
3575 if (codeflags & CO_GENERATOR_ALLOWED) { |
|
3ba0f1b20320
Patch #494783: Rename cmp_op enumerators.
Martin v. Löwis <martin@v.loewis.de>
parents:
21537
diff
changeset
|
3576 result = 1; |
|
3ba0f1b20320
Patch #494783: Rename cmp_op enumerators.
Martin v. Löwis <martin@v.loewis.de>
parents:
21537
diff
changeset
|
3577 cf->cf_flags |= CO_GENERATOR_ALLOWED; |
|
3ba0f1b20320
Patch #494783: Rename cmp_op enumerators.
Martin v. Löwis <martin@v.loewis.de>
parents:
21537
diff
changeset
|
3578 } |
|
22468
eebae4f60d05
Disable the parser hacks that enabled the "yield" keyword using a future
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
22398
diff
changeset
|
3579 #endif |
|
18611
fdb36a0c7e6e
Part way to allowing "from __future__ import generators" to communicate
Tim Peters <tim.peters@gmail.com>
parents:
18513
diff
changeset
|
3580 } |
|
fdb36a0c7e6e
Part way to allowing "from __future__ import generators" to communicate
Tim Peters <tim.peters@gmail.com>
parents:
18513
diff
changeset
|
3581 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
|
3582 } |
|
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
|
3583 |
| 86 | 3584 |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
3585 /* External interface to call any callable object. |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
3586 The arg must be a tuple or NULL. */ |
|
314
e83852d1a5e2
Add interface to call a Python function (or other callable) object
Guido van Rossum <guido@python.org>
parents:
312
diff
changeset
|
3587 |
|
6206
77f5b6cbea66
Inline PyObject_CallObject (Marc-Andre Lemburg).
Guido van Rossum <guido@python.org>
parents:
6185
diff
changeset
|
3588 #undef PyEval_CallObject |
|
77f5b6cbea66
Inline PyObject_CallObject (Marc-Andre Lemburg).
Guido van Rossum <guido@python.org>
parents:
6185
diff
changeset
|
3589 /* for backward compatibility: export this interface */ |
|
77f5b6cbea66
Inline PyObject_CallObject (Marc-Andre Lemburg).
Guido van Rossum <guido@python.org>
parents:
6185
diff
changeset
|
3590 |
| 5368 | 3591 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
3592 PyEval_CallObject(PyObject *func, PyObject *arg) |
|
314
e83852d1a5e2
Add interface to call a Python function (or other callable) object
Guido van Rossum <guido@python.org>
parents:
312
diff
changeset
|
3593 { |
| 5368 | 3594 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL); |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
3595 } |
|
6206
77f5b6cbea66
Inline PyObject_CallObject (Marc-Andre Lemburg).
Guido van Rossum <guido@python.org>
parents:
6185
diff
changeset
|
3596 #define PyEval_CallObject(func,arg) \ |
|
77f5b6cbea66
Inline PyObject_CallObject (Marc-Andre Lemburg).
Guido van Rossum <guido@python.org>
parents:
6185
diff
changeset
|
3597 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL) |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
3598 |
| 5368 | 3599 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
3600 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
|
3601 { |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3602 PyObject *result; |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
3603 |
|
36877
e9a7a2784e17
SF #1444030: Fix several potential defects found by Coverity.
Hye-Shik Chang <hyeshik@gmail.com>
parents:
36803
diff
changeset
|
3604 if (arg == NULL) { |
| 5368 | 3605 arg = PyTuple_New(0); |
|
36877
e9a7a2784e17
SF #1444030: Fix several potential defects found by Coverity.
Hye-Shik Chang <hyeshik@gmail.com>
parents:
36803
diff
changeset
|
3606 if (arg == NULL) |
|
e9a7a2784e17
SF #1444030: Fix several potential defects found by Coverity.
Hye-Shik Chang <hyeshik@gmail.com>
parents:
36803
diff
changeset
|
3607 return NULL; |
|
e9a7a2784e17
SF #1444030: Fix several potential defects found by Coverity.
Hye-Shik Chang <hyeshik@gmail.com>
parents:
36803
diff
changeset
|
3608 } |
| 5368 | 3609 else if (!PyTuple_Check(arg)) { |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5368
diff
changeset
|
3610 PyErr_SetString(PyExc_TypeError, |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5368
diff
changeset
|
3611 "argument list must be a tuple"); |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
3612 return NULL; |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
3613 } |
|
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
3614 else |
| 5368 | 3615 Py_INCREF(arg); |
|
2844
0261bf5b3819
keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents:
2813
diff
changeset
|
3616 |
| 5368 | 3617 if (kw != NULL && !PyDict_Check(kw)) { |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5368
diff
changeset
|
3618 PyErr_SetString(PyExc_TypeError, |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5368
diff
changeset
|
3619 "keyword list must be a dictionary"); |
|
12440
d47460b1a679
Charles Waldman writes:
Guido van Rossum <guido@python.org>
parents:
12320
diff
changeset
|
3620 Py_DECREF(arg); |
|
2894
4095782c940e
empty kw dict is ok for builtins
Guido van Rossum <guido@python.org>
parents:
2872
diff
changeset
|
3621 return NULL; |
|
4095782c940e
empty kw dict is ok for builtins
Guido van Rossum <guido@python.org>
parents:
2872
diff
changeset
|
3622 } |
|
4095782c940e
empty kw dict is ok for builtins
Guido van Rossum <guido@python.org>
parents:
2872
diff
changeset
|
3623 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18611
diff
changeset
|
3624 result = PyObject_Call(func, arg, kw); |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3625 Py_DECREF(arg); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3626 return result; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3627 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3628 |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35745
diff
changeset
|
3629 const char * |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18611
diff
changeset
|
3630 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
|
3631 { |
|
c9e07bc303a2
Fix exception handling for non-PyFunction objects, SF bug 414743.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17125
diff
changeset
|
3632 if (PyMethod_Check(func)) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18611
diff
changeset
|
3633 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func)); |
|
17406
c9e07bc303a2
Fix exception handling for non-PyFunction objects, SF bug 414743.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17125
diff
changeset
|
3634 else if (PyFunction_Check(func)) |
|
48660
85b67fb5672b
Rename PyUnicode_AsString -> _PyUnicode_AsString and
Marc-André Lemburg <mal@egenix.com>
parents:
48574
diff
changeset
|
3635 return _PyUnicode_AsString(((PyFunctionObject*)func)->func_name); |
|
17406
c9e07bc303a2
Fix exception handling for non-PyFunction objects, SF bug 414743.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17125
diff
changeset
|
3636 else if (PyCFunction_Check(func)) |
|
c9e07bc303a2
Fix exception handling for non-PyFunction objects, SF bug 414743.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17125
diff
changeset
|
3637 return ((PyCFunctionObject*)func)->m_ml->ml_name; |
|
39536
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
3638 else |
|
17406
c9e07bc303a2
Fix exception handling for non-PyFunction objects, SF bug 414743.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17125
diff
changeset
|
3639 return func->ob_type->tp_name; |
|
c9e07bc303a2
Fix exception handling for non-PyFunction objects, SF bug 414743.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17125
diff
changeset
|
3640 } |
|
c9e07bc303a2
Fix exception handling for non-PyFunction objects, SF bug 414743.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17125
diff
changeset
|
3641 |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35745
diff
changeset
|
3642 const char * |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18611
diff
changeset
|
3643 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
|
3644 { |
|
c9e07bc303a2
Fix exception handling for non-PyFunction objects, SF bug 414743.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17125
diff
changeset
|
3645 if (PyMethod_Check(func)) |
|
c9e07bc303a2
Fix exception handling for non-PyFunction objects, SF bug 414743.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17125
diff
changeset
|
3646 return "()"; |
|
c9e07bc303a2
Fix exception handling for non-PyFunction objects, SF bug 414743.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17125
diff
changeset
|
3647 else if (PyFunction_Check(func)) |
|
c9e07bc303a2
Fix exception handling for non-PyFunction objects, SF bug 414743.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17125
diff
changeset
|
3648 return "()"; |
|
c9e07bc303a2
Fix exception handling for non-PyFunction objects, SF bug 414743.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17125
diff
changeset
|
3649 else if (PyCFunction_Check(func)) |
|
c9e07bc303a2
Fix exception handling for non-PyFunction objects, SF bug 414743.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17125
diff
changeset
|
3650 return "()"; |
|
39536
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
3651 else |
|
17406
c9e07bc303a2
Fix exception handling for non-PyFunction objects, SF bug 414743.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17125
diff
changeset
|
3652 return " object"; |
|
c9e07bc303a2
Fix exception handling for non-PyFunction objects, SF bug 414743.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17125
diff
changeset
|
3653 } |
|
c9e07bc303a2
Fix exception handling for non-PyFunction objects, SF bug 414743.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17125
diff
changeset
|
3654 |
|
26141
6ce9228a3da2
Make private functions static so we don't pollute the namespace
Neal Norwitz <nnorwitz@gmail.com>
parents:
26110
diff
changeset
|
3655 static void |
|
24870
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
3656 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
|
3657 { |
|
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
3658 if (flags & METH_NOARGS) |
|
31872
9f5fe6b23e59
Since the fast_yield branch target was introduced, it appears that most
Tim Peters <tim.peters@gmail.com>
parents:
31797
diff
changeset
|
3659 PyErr_Format(PyExc_TypeError, |
|
24978
b1ab4e8d7d9c
The error messages in err_args() -- which is only called when the
Guido van Rossum <guido@python.org>
parents:
24916
diff
changeset
|
3660 "%.200s() takes no arguments (%d given)", |
|
31872
9f5fe6b23e59
Since the fast_yield branch target was introduced, it appears that most
Tim Peters <tim.peters@gmail.com>
parents:
31797
diff
changeset
|
3661 ((PyCFunctionObject *)func)->m_ml->ml_name, |
|
24870
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
3662 nargs); |
|
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
3663 else |
|
31872
9f5fe6b23e59
Since the fast_yield branch target was introduced, it appears that most
Tim Peters <tim.peters@gmail.com>
parents:
31797
diff
changeset
|
3664 PyErr_Format(PyExc_TypeError, |
|
24978
b1ab4e8d7d9c
The error messages in err_args() -- which is only called when the
Guido van Rossum <guido@python.org>
parents:
24916
diff
changeset
|
3665 "%.200s() takes exactly one argument (%d given)", |
|
31872
9f5fe6b23e59
Since the fast_yield branch target was introduced, it appears that most
Tim Peters <tim.peters@gmail.com>
parents:
31797
diff
changeset
|
3666 ((PyCFunctionObject *)func)->m_ml->ml_name, |
|
24870
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
3667 nargs); |
|
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
3668 } |
|
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
3669 |
|
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
|
3670 #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
|
3671 if (tstate->use_tracing && tstate->c_profilefunc) { \ |
|
77913be294b9
Massive performance improvement for C extension and builtin tracing code
Nicholas Bastin <nick.bastin@gmail.com>
parents:
32398
diff
changeset
|
3672 if (call_trace(tstate->c_profilefunc, \ |
|
77913be294b9
Massive performance improvement for C extension and builtin tracing code
Nicholas Bastin <nick.bastin@gmail.com>
parents:
32398
diff
changeset
|
3673 tstate->c_profileobj, \ |
|
77913be294b9
Massive performance improvement for C extension and builtin tracing code
Nicholas Bastin <nick.bastin@gmail.com>
parents:
32398
diff
changeset
|
3674 tstate->frame, PyTrace_C_CALL, \ |
|
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
|
3675 func)) { \ |
|
23dda92de993
clean-up tracing of C functions. In particular, don't call the trace func
Armin Rigo <arigo@tunes.org>
parents:
35345
diff
changeset
|
3676 x = NULL; \ |
|
23dda92de993
clean-up tracing of C functions. In particular, don't call the trace func
Armin Rigo <arigo@tunes.org>
parents:
35345
diff
changeset
|
3677 } \ |
|
23dda92de993
clean-up tracing of C functions. In particular, don't call the trace func
Armin Rigo <arigo@tunes.org>
parents:
35345
diff
changeset
|
3678 else { \ |
|
23dda92de993
clean-up tracing of C functions. In particular, don't call the trace func
Armin Rigo <arigo@tunes.org>
parents:
35345
diff
changeset
|
3679 x = call; \ |
|
23dda92de993
clean-up tracing of C functions. In particular, don't call the trace func
Armin Rigo <arigo@tunes.org>
parents:
35345
diff
changeset
|
3680 if (tstate->c_profilefunc != NULL) { \ |
|
23dda92de993
clean-up tracing of C functions. In particular, don't call the trace func
Armin Rigo <arigo@tunes.org>
parents:
35345
diff
changeset
|
3681 if (x == NULL) { \ |
|
23dda92de993
clean-up tracing of C functions. In particular, don't call the trace func
Armin Rigo <arigo@tunes.org>
parents:
35345
diff
changeset
|
3682 call_trace_protected(tstate->c_profilefunc, \ |
|
23dda92de993
clean-up tracing of C functions. In particular, don't call the trace func
Armin Rigo <arigo@tunes.org>
parents:
35345
diff
changeset
|
3683 tstate->c_profileobj, \ |
|
23dda92de993
clean-up tracing of C functions. In particular, don't call the trace func
Armin Rigo <arigo@tunes.org>
parents:
35345
diff
changeset
|
3684 tstate->frame, PyTrace_C_EXCEPTION, \ |
|
23dda92de993
clean-up tracing of C functions. In particular, don't call the trace func
Armin Rigo <arigo@tunes.org>
parents:
35345
diff
changeset
|
3685 func); \ |
|
23dda92de993
clean-up tracing of C functions. In particular, don't call the trace func
Armin Rigo <arigo@tunes.org>
parents:
35345
diff
changeset
|
3686 /* XXX should pass (type, value, tb) */ \ |
|
23dda92de993
clean-up tracing of C functions. In particular, don't call the trace func
Armin Rigo <arigo@tunes.org>
parents:
35345
diff
changeset
|
3687 } else { \ |
|
23dda92de993
clean-up tracing of C functions. In particular, don't call the trace func
Armin Rigo <arigo@tunes.org>
parents:
35345
diff
changeset
|
3688 if (call_trace(tstate->c_profilefunc, \ |
|
23dda92de993
clean-up tracing of C functions. In particular, don't call the trace func
Armin Rigo <arigo@tunes.org>
parents:
35345
diff
changeset
|
3689 tstate->c_profileobj, \ |
|
23dda92de993
clean-up tracing of C functions. In particular, don't call the trace func
Armin Rigo <arigo@tunes.org>
parents:
35345
diff
changeset
|
3690 tstate->frame, PyTrace_C_RETURN, \ |
|
23dda92de993
clean-up tracing of C functions. In particular, don't call the trace func
Armin Rigo <arigo@tunes.org>
parents:
35345
diff
changeset
|
3691 func)) { \ |
|
23dda92de993
clean-up tracing of C functions. In particular, don't call the trace func
Armin Rigo <arigo@tunes.org>
parents:
35345
diff
changeset
|
3692 Py_DECREF(x); \ |
|
23dda92de993
clean-up tracing of C functions. In particular, don't call the trace func
Armin Rigo <arigo@tunes.org>
parents:
35345
diff
changeset
|
3693 x = NULL; \ |
|
23dda92de993
clean-up tracing of C functions. In particular, don't call the trace func
Armin Rigo <arigo@tunes.org>
parents:
35345
diff
changeset
|
3694 } \ |
|
23dda92de993
clean-up tracing of C functions. In particular, don't call the trace func
Armin Rigo <arigo@tunes.org>
parents:
35345
diff
changeset
|
3695 } \ |
|
31796
1c117dbb2def
Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents:
31768
diff
changeset
|
3696 } \ |
|
32409
77913be294b9
Massive performance improvement for C extension and builtin tracing code
Nicholas Bastin <nick.bastin@gmail.com>
parents:
32398
diff
changeset
|
3697 } \ |
|
77913be294b9
Massive performance improvement for C extension and builtin tracing code
Nicholas Bastin <nick.bastin@gmail.com>
parents:
32398
diff
changeset
|
3698 } else { \ |
|
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
|
3699 x = call; \ |
|
31796
1c117dbb2def
Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents:
31768
diff
changeset
|
3700 } |
|
1c117dbb2def
Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents:
31768
diff
changeset
|
3701 |
|
24868
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3702 static PyObject * |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
3703 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
|
3704 #ifdef WITH_TSC |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
3705 , uint64* pintr0, uint64* pintr1 |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
3706 #endif |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
32247
diff
changeset
|
3707 ) |
|
24868
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3708 { |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3709 int na = oparg & 0xff; |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3710 int nk = (oparg>>8) & 0xff; |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3711 int n = na + 2 * nk; |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3712 PyObject **pfunc = (*pp_stack) - n - 1; |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3713 PyObject *func = *pfunc; |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3714 PyObject *x, *w; |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3715 |
|
27712
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3716 /* Always dispatch PyCFunction first, because these are |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3717 presumed to be the most frequent callable object. |
|
24868
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3718 */ |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3719 if (PyCFunction_Check(func) && nk == 0) { |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3720 int flags = PyCFunction_GET_FLAGS(func); |
|
32412
393c15c0c5a4
Get ceval.c to compile again by moving declarations before other statments.
Raymond Hettinger <python@rcn.com>
parents:
32409
diff
changeset
|
3721 PyThreadState *tstate = PyThreadState_GET(); |
|
393c15c0c5a4
Get ceval.c to compile again by moving declarations before other statments.
Raymond Hettinger <python@rcn.com>
parents:
32409
diff
changeset
|
3722 |
|
27712
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3723 PCALL(PCALL_CFUNCTION); |
|
24870
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
3724 if (flags & (METH_NOARGS | METH_O)) { |
|
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
3725 PyCFunction meth = PyCFunction_GET_FUNCTION(func); |
|
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
3726 PyObject *self = PyCFunction_GET_SELF(func); |
|
31796
1c117dbb2def
Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents:
31768
diff
changeset
|
3727 if (flags & METH_NOARGS && na == 0) { |
|
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
|
3728 C_TRACE(x, (*meth)(self,NULL)); |
|
31796
1c117dbb2def
Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents:
31768
diff
changeset
|
3729 } |
|
24870
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
3730 else if (flags & METH_O && na == 1) { |
|
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
3731 PyObject *arg = EXT_POP(*pp_stack); |
|
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
|
3732 C_TRACE(x, (*meth)(self,arg)); |
|
24870
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
3733 Py_DECREF(arg); |
|
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
3734 } |
|
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
3735 else { |
|
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
3736 err_args(func, flags, na); |
|
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
3737 x = NULL; |
|
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
3738 } |
|
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
3739 } |
|
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
3740 else { |
|
24868
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3741 PyObject *callargs; |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3742 callargs = load_args(pp_stack, na); |
|
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
|
3743 READ_TIMESTAMP(*pintr0); |
|
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
|
3744 C_TRACE(x, PyCFunction_Call(func,callargs,NULL)); |
|
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
|
3745 READ_TIMESTAMP(*pintr1); |
|
31872
9f5fe6b23e59
Since the fast_yield branch target was introduced, it appears that most
Tim Peters <tim.peters@gmail.com>
parents:
31797
diff
changeset
|
3746 Py_XDECREF(callargs); |
|
9f5fe6b23e59
Since the fast_yield branch target was introduced, it appears that most
Tim Peters <tim.peters@gmail.com>
parents:
31797
diff
changeset
|
3747 } |
|
24868
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3748 } else { |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3749 if (PyMethod_Check(func) && PyMethod_GET_SELF(func) != NULL) { |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3750 /* optimize access to bound methods */ |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3751 PyObject *self = PyMethod_GET_SELF(func); |
|
27712
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3752 PCALL(PCALL_METHOD); |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3753 PCALL(PCALL_BOUND_METHOD); |
|
24868
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3754 Py_INCREF(self); |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3755 func = PyMethod_GET_FUNCTION(func); |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3756 Py_INCREF(func); |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3757 Py_DECREF(*pfunc); |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3758 *pfunc = self; |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3759 na++; |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3760 n++; |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3761 } else |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3762 Py_INCREF(func); |
|
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
|
3763 READ_TIMESTAMP(*pintr0); |
|
24868
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3764 if (PyFunction_Check(func)) |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3765 x = fast_function(func, pp_stack, n, na, nk); |
|
31872
9f5fe6b23e59
Since the fast_yield branch target was introduced, it appears that most
Tim Peters <tim.peters@gmail.com>
parents:
31797
diff
changeset
|
3766 else |
|
24868
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3767 x = do_call(func, pp_stack, na, nk); |
|
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
|
3768 READ_TIMESTAMP(*pintr1); |
|
24868
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3769 Py_DECREF(func); |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3770 } |
|
31872
9f5fe6b23e59
Since the fast_yield branch target was introduced, it appears that most
Tim Peters <tim.peters@gmail.com>
parents:
31797
diff
changeset
|
3771 |
|
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
|
3772 /* Clear the stack of the function object. Also removes |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37056
diff
changeset
|
3773 the arguments in case they weren't consumed already |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37056
diff
changeset
|
3774 (fast_function() and err_args() leave them on the stack). |
|
36756
d0ca6302dd3c
Put back the essence of Jeremy's original XXX comment.
Thomas Wouters <thomas@python.org>
parents:
36751
diff
changeset
|
3775 */ |
|
24868
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3776 while ((*pp_stack) > pfunc) { |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3777 w = EXT_POP(*pp_stack); |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3778 Py_DECREF(w); |
|
27712
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3779 PCALL(PCALL_POP); |
|
24868
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3780 } |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3781 return x; |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3782 } |
|
2306001f6eaa
Move body of CALL_FUNCTION opcode into helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24866
diff
changeset
|
3783 |
|
24870
df2326a4894d
Inline fast_cfunction() in new call_function().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24868
diff
changeset
|
3784 /* 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
|
3785 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
|
3786 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
|
3787 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
|
3788 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
|
3789 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
|
3790 done before evaluating the frame. |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3791 */ |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3792 |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3793 static PyObject * |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
3794 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
|
3795 { |
|
27712
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3796 PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3797 PyObject *globals = PyFunction_GET_GLOBALS(func); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3798 PyObject *argdefs = PyFunction_GET_DEFAULTS(func); |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
3799 PyObject *kwdefs = PyFunction_GET_KW_DEFAULTS(func); |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3800 PyObject **d = NULL; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3801 int nd = 0; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3802 |
|
27712
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3803 PCALL(PCALL_FUNCTION); |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3804 PCALL(PCALL_FAST_FUNCTION); |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
3805 if (argdefs == NULL && co->co_argcount == n && |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
3806 co->co_kwonlyargcount == 0 && nk==0 && |
|
27712
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3807 co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3808 PyFrameObject *f; |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3809 PyObject *retval = NULL; |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3810 PyThreadState *tstate = PyThreadState_GET(); |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3811 PyObject **fastlocals, **stack; |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3812 int i; |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3813 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3814 PCALL(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
|
3815 assert(globals != NULL); |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3816 /* XXX Perhaps we should create a specialized |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3817 PyFrame_New() that doesn't take locals, but does |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3818 take builtins without sanity checking them. |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3819 */ |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39536
diff
changeset
|
3820 assert(tstate != NULL); |
|
27712
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3821 f = PyFrame_New(tstate, co, globals, NULL); |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3822 if (f == NULL) |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3823 return NULL; |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3824 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3825 fastlocals = f->f_localsplus; |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3826 stack = (*pp_stack) - n; |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3827 |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3828 for (i = 0; i < n; i++) { |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3829 Py_INCREF(*stack); |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3830 fastlocals[i] = *stack++; |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3831 } |
|
35298
b2fe5f8fcfdd
PEP 342 implementation. Per Guido's comments, the generator throw()
Phillip J. Eby <pje@telecommunity.com>
parents:
35126
diff
changeset
|
3832 retval = PyEval_EvalFrameEx(f,0); |
|
27712
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3833 ++tstate->recursion_depth; |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3834 Py_DECREF(f); |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3835 --tstate->recursion_depth; |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3836 return retval; |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3837 } |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3838 if (argdefs != NULL) { |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3839 d = &PyTuple_GET_ITEM(argdefs, 0); |
|
44351
86a2679dca46
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT.
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
3840 nd = Py_SIZE(argdefs); |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3841 } |
|
27712
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3842 return PyEval_EvalCodeEx(co, globals, |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3843 (PyObject *)NULL, (*pp_stack)-n, na, |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39782
diff
changeset
|
3844 (*pp_stack)-2*nk, nk, d, nd, kwdefs, |
|
27712
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3845 PyFunction_GET_CLOSURE(func)); |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3846 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3847 |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3848 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
|
3849 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
|
3850 PyObject *func) |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3851 { |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3852 PyObject *kwdict = NULL; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3853 if (orig_kwdict == NULL) |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3854 kwdict = PyDict_New(); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3855 else { |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3856 kwdict = PyDict_Copy(orig_kwdict); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3857 Py_DECREF(orig_kwdict); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3858 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3859 if (kwdict == NULL) |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3860 return NULL; |
|
31894
310dd98ea064
Revert 2.393, elimination of pre-decrementing, which
Raymond Hettinger <python@rcn.com>
parents:
31880
diff
changeset
|
3861 while (--nk >= 0) { |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3862 int err; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3863 PyObject *value = EXT_POP(*pp_stack); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3864 PyObject *key = EXT_POP(*pp_stack); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3865 if (PyDict_GetItem(kwdict, key) != NULL) { |
|
43410
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
3866 PyErr_Format(PyExc_TypeError, |
|
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
3867 "%.200s%s got multiple values " |
|
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
3868 "for keyword argument '%.200s'", |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18611
diff
changeset
|
3869 PyEval_GetFuncName(func), |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18611
diff
changeset
|
3870 PyEval_GetFuncDesc(func), |
|
48660
85b67fb5672b
Rename PyUnicode_AsString -> _PyUnicode_AsString and
Marc-André Lemburg <mal@egenix.com>
parents:
48574
diff
changeset
|
3871 _PyUnicode_AsString(key)); |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3872 Py_DECREF(key); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3873 Py_DECREF(value); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3874 Py_DECREF(kwdict); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3875 return NULL; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3876 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3877 err = PyDict_SetItem(kwdict, key, value); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3878 Py_DECREF(key); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3879 Py_DECREF(value); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3880 if (err) { |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3881 Py_DECREF(kwdict); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3882 return NULL; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3883 } |
|
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 return kwdict; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3886 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3887 |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3888 static PyObject * |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3889 update_star_args(int nstack, int nstar, PyObject *stararg, |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3890 PyObject ***pp_stack) |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3891 { |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3892 PyObject *callargs, *w; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3893 |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3894 callargs = PyTuple_New(nstack + nstar); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3895 if (callargs == NULL) { |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3896 return NULL; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3897 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3898 if (nstar) { |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3899 int i; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3900 for (i = 0; i < nstar; i++) { |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3901 PyObject *a = PyTuple_GET_ITEM(stararg, i); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3902 Py_INCREF(a); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3903 PyTuple_SET_ITEM(callargs, nstack + i, a); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3904 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3905 } |
|
31894
310dd98ea064
Revert 2.393, elimination of pre-decrementing, which
Raymond Hettinger <python@rcn.com>
parents:
31880
diff
changeset
|
3906 while (--nstack >= 0) { |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3907 w = EXT_POP(*pp_stack); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3908 PyTuple_SET_ITEM(callargs, nstack, w); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3909 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3910 return callargs; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3911 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3912 |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3913 static PyObject * |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3914 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
|
3915 { |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3916 PyObject *args = PyTuple_New(na); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3917 PyObject *w; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3918 |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3919 if (args == NULL) |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3920 return NULL; |
|
31894
310dd98ea064
Revert 2.393, elimination of pre-decrementing, which
Raymond Hettinger <python@rcn.com>
parents:
31880
diff
changeset
|
3921 while (--na >= 0) { |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3922 w = EXT_POP(*pp_stack); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3923 PyTuple_SET_ITEM(args, na, w); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3924 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3925 return args; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3926 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3927 |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3928 static PyObject * |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3929 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
|
3930 { |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3931 PyObject *callargs = NULL; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3932 PyObject *kwdict = NULL; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3933 PyObject *result = NULL; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3934 |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3935 if (nk > 0) { |
|
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
|
3936 kwdict = update_keyword_args(NULL, nk, pp_stack, func); |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3937 if (kwdict == NULL) |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3938 goto call_fail; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3939 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3940 callargs = load_args(pp_stack, na); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3941 if (callargs == NULL) |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3942 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
|
3943 #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
|
3944 /* At this point, we have to look at the type of func to |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3945 update the call stats properly. Do it here so as to avoid |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3946 exposing the call stats machinery outside ceval.c |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3947 */ |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3948 if (PyFunction_Check(func)) |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3949 PCALL(PCALL_FUNCTION); |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3950 else if (PyMethod_Check(func)) |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3951 PCALL(PCALL_METHOD); |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3952 else if (PyType_Check(func)) |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3953 PCALL(PCALL_TYPE); |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3954 else |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3955 PCALL(PCALL_OTHER); |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
3956 #endif |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18611
diff
changeset
|
3957 result = PyObject_Call(func, callargs, kwdict); |
| 43411 | 3958 call_fail: |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3959 Py_XDECREF(callargs); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3960 Py_XDECREF(kwdict); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3961 return result; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3962 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3963 |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3964 static PyObject * |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3965 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
|
3966 { |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3967 int nstar = 0; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3968 PyObject *callargs = NULL; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3969 PyObject *stararg = NULL; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3970 PyObject *kwdict = NULL; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3971 PyObject *result = NULL; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3972 |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3973 if (flags & CALL_FLAG_KW) { |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
3974 kwdict = EXT_POP(*pp_stack); |
|
41824
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
3975 if (!PyDict_Check(kwdict)) { |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
3976 PyObject *d; |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
3977 d = PyDict_New(); |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
3978 if (d == NULL) |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
3979 goto ext_call_fail; |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
3980 if (PyDict_Update(d, kwdict) != 0) { |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
3981 Py_DECREF(d); |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
3982 /* PyDict_Update raises attribute |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
3983 * error (percolated from an attempt |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
3984 * to get 'keys' attribute) instead of |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
3985 * a type error if its second argument |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
3986 * is not a mapping. |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
3987 */ |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
3988 if (PyErr_ExceptionMatches(PyExc_AttributeError)) { |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
3989 PyErr_Format(PyExc_TypeError, |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
3990 "%.200s%.200s argument after ** " |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
3991 "must be a mapping, not %.200s", |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
3992 PyEval_GetFuncName(func), |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
3993 PyEval_GetFuncDesc(func), |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
3994 kwdict->ob_type->tp_name); |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
3995 } |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
3996 goto ext_call_fail; |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
3997 } |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
3998 Py_DECREF(kwdict); |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
3999 kwdict = d; |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4000 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4001 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4002 if (flags & CALL_FLAG_VAR) { |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4003 stararg = EXT_POP(*pp_stack); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4004 if (!PyTuple_Check(stararg)) { |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4005 PyObject *t = NULL; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4006 t = PySequence_Tuple(stararg); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4007 if (t == NULL) { |
|
17406
c9e07bc303a2
Fix exception handling for non-PyFunction objects, SF bug 414743.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17125
diff
changeset
|
4008 if (PyErr_ExceptionMatches(PyExc_TypeError)) { |
|
c9e07bc303a2
Fix exception handling for non-PyFunction objects, SF bug 414743.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17125
diff
changeset
|
4009 PyErr_Format(PyExc_TypeError, |
|
41824
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
4010 "%.200s%.200s argument after * " |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
4011 "must be a sequence, not %200s", |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18611
diff
changeset
|
4012 PyEval_GetFuncName(func), |
|
41824
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
4013 PyEval_GetFuncDesc(func), |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
4014 stararg->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
|
4015 } |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4016 goto ext_call_fail; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4017 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4018 Py_DECREF(stararg); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4019 stararg = t; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4020 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4021 nstar = PyTuple_GET_SIZE(stararg); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4022 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4023 if (nk > 0) { |
|
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
|
4024 kwdict = update_keyword_args(kwdict, nk, pp_stack, func); |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4025 if (kwdict == NULL) |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4026 goto ext_call_fail; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4027 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4028 callargs = update_star_args(na, nstar, stararg, pp_stack); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4029 if (callargs == NULL) |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4030 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
|
4031 #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
|
4032 /* At this point, we have to look at the type of func to |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
4033 update the call stats properly. Do it here so as to avoid |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
4034 exposing the call stats machinery outside ceval.c |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
4035 */ |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
4036 if (PyFunction_Check(func)) |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
4037 PCALL(PCALL_FUNCTION); |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
4038 else if (PyMethod_Check(func)) |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
4039 PCALL(PCALL_METHOD); |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
4040 else if (PyType_Check(func)) |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
4041 PCALL(PCALL_TYPE); |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
4042 else |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
4043 PCALL(PCALL_OTHER); |
|
16856c9514e0
Small function call optimization and special build option for call stats.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27295
diff
changeset
|
4044 #endif |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18611
diff
changeset
|
4045 result = PyObject_Call(func, callargs, kwdict); |
|
43410
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43188
diff
changeset
|
4046 ext_call_fail: |
|
15711
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4047 Py_XDECREF(callargs); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4048 Py_XDECREF(kwdict); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4049 Py_XDECREF(stararg); |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4050 return result; |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4051 } |
|
2481b5fe86d6
Revised implementation of CALL_FUNCTION and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
15364
diff
changeset
|
4052 |
|
36882
6a9c7165b17b
Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents:
36877
diff
changeset
|
4053 /* 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
|
4054 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
|
4055 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
|
4056 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
|
4057 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
|
4058 */ |
|
21441
05ad7a69d933
_PyEval_SliceIndex(): explain why a NULL argument is allowed (thanks
Tim Peters <tim.peters@gmail.com>
parents:
21440
diff
changeset
|
4059 /* 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
|
4060 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
|
4061 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
|
4062 */ |
| 12614 | 4063 int |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36475
diff
changeset
|
4064 _PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi) |
| 69 | 4065 { |
|
21441
05ad7a69d933
_PyEval_SliceIndex(): explain why a NULL argument is allowed (thanks
Tim Peters <tim.peters@gmail.com>
parents:
21440
diff
changeset
|
4066 if (v != NULL) { |
|
36558
d3685f9b7b71
Remove size constraints in SLICE opcodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36501
diff
changeset
|
4067 Py_ssize_t x; |
|
44158
81e0c0e2a8c1
Remove PyInt_CheckExact. Add PyLong_AsLongAndOverflow.
Martin v. Löwis <martin@v.loewis.de>
parents:
44156
diff
changeset
|
4068 if (PyIndex_Check(v)) { |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39536
diff
changeset
|
4069 x = PyNumber_AsSsize_t(v, NULL); |
|
36882
6a9c7165b17b
Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents:
36877
diff
changeset
|
4070 if (x == -1 && PyErr_Occurred()) |
|
6a9c7165b17b
Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents:
36877
diff
changeset
|
4071 return 0; |
|
6a9c7165b17b
Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents:
36877
diff
changeset
|
4072 } |
|
6a9c7165b17b
Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents:
36877
diff
changeset
|
4073 else { |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5368
diff
changeset
|
4074 PyErr_SetString(PyExc_TypeError, |
|
36882
6a9c7165b17b
Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents:
36877
diff
changeset
|
4075 "slice indices must be integers or " |
|
6a9c7165b17b
Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents:
36877
diff
changeset
|
4076 "None or have an __index__ method"); |
| 12614 | 4077 return 0; |
| 69 | 4078 } |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
5368
diff
changeset
|
4079 *pi = x; |
| 69 | 4080 } |
| 12614 | 4081 return 1; |
| 69 | 4082 } |
| 4083 | |
|
42132
863ed7cd45dc
Merged revisions 56020-56124 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
4084 #define CANNOT_CATCH_MSG "catching classes that do not inherit from "\ |
|
40946
d976c9a63111
Make it so TypeError is raised if an instance of an object is put in an
Brett Cannon <bcannon@gmail.com>
parents:
40943
diff
changeset
|
4085 "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
|
4086 |
| 5368 | 4087 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
4088 cmp_outcome(int op, register PyObject *v, register PyObject *w) |
| 69 | 4089 { |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
4090 int res = 0; |
| 69 | 4091 switch (op) { |
|
21609
3ba0f1b20320
Patch #494783: Rename cmp_op enumerators.
Martin v. Löwis <martin@v.loewis.de>
parents:
21537
diff
changeset
|
4092 case PyCmp_IS: |
|
27295
b8387730dd8f
SF patch #670367: Micro-optimizations for ceval.c
Raymond Hettinger <python@rcn.com>
parents:
27243
diff
changeset
|
4093 res = (v == w); |
|
b8387730dd8f
SF patch #670367: Micro-optimizations for ceval.c
Raymond Hettinger <python@rcn.com>
parents:
27243
diff
changeset
|
4094 break; |
|
21609
3ba0f1b20320
Patch #494783: Rename cmp_op enumerators.
Martin v. Löwis <martin@v.loewis.de>
parents:
21537
diff
changeset
|
4095 case PyCmp_IS_NOT: |
|
27295
b8387730dd8f
SF patch #670367: Micro-optimizations for ceval.c
Raymond Hettinger <python@rcn.com>
parents:
27243
diff
changeset
|
4096 res = (v != w); |
| 86 | 4097 break; |
|
21609
3ba0f1b20320
Patch #494783: Rename cmp_op enumerators.
Martin v. Löwis <martin@v.loewis.de>
parents:
21537
diff
changeset
|
4098 case PyCmp_IN: |
|
27295
b8387730dd8f
SF patch #670367: Micro-optimizations for ceval.c
Raymond Hettinger <python@rcn.com>
parents:
27243
diff
changeset
|
4099 res = PySequence_Contains(w, v); |
|
b8387730dd8f
SF patch #670367: Micro-optimizations for ceval.c
Raymond Hettinger <python@rcn.com>
parents:
27243
diff
changeset
|
4100 if (res < 0) |
|
b8387730dd8f
SF patch #670367: Micro-optimizations for ceval.c
Raymond Hettinger <python@rcn.com>
parents:
27243
diff
changeset
|
4101 return NULL; |
|
b8387730dd8f
SF patch #670367: Micro-optimizations for ceval.c
Raymond Hettinger <python@rcn.com>
parents:
27243
diff
changeset
|
4102 break; |
|
21609
3ba0f1b20320
Patch #494783: Rename cmp_op enumerators.
Martin v. Löwis <martin@v.loewis.de>
parents:
21537
diff
changeset
|
4103 case PyCmp_NOT_IN: |
|
8403
c4df8b6637b6
Moved cmp_member() to abstract.c, as PySequence_Contains() [with
Guido van Rossum <guido@python.org>
parents:
8328
diff
changeset
|
4104 res = PySequence_Contains(w, v); |
| 86 | 4105 if (res < 0) |
| 4106 return NULL; | |
|
27295
b8387730dd8f
SF patch #670367: Micro-optimizations for ceval.c
Raymond Hettinger <python@rcn.com>
parents:
27243
diff
changeset
|
4107 res = !res; |
| 69 | 4108 break; |
|
21609
3ba0f1b20320
Patch #494783: Rename cmp_op enumerators.
Martin v. Löwis <martin@v.loewis.de>
parents:
21537
diff
changeset
|
4109 case PyCmp_EXC_MATCH: |
|
40742
f1701ba2452b
Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40729
diff
changeset
|
4110 if (PyTuple_Check(w)) { |
|
f1701ba2452b
Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40729
diff
changeset
|
4111 Py_ssize_t i, length; |
|
f1701ba2452b
Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40729
diff
changeset
|
4112 length = PyTuple_Size(w); |
|
f1701ba2452b
Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40729
diff
changeset
|
4113 for (i = 0; i < length; i += 1) { |
|
f1701ba2452b
Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40729
diff
changeset
|
4114 PyObject *exc = PyTuple_GET_ITEM(w, i); |
|
40946
d976c9a63111
Make it so TypeError is raised if an instance of an object is put in an
Brett Cannon <bcannon@gmail.com>
parents:
40943
diff
changeset
|
4115 if (!PyExceptionClass_Check(exc)) { |
|
d976c9a63111
Make it so TypeError is raised if an instance of an object is put in an
Brett Cannon <bcannon@gmail.com>
parents:
40943
diff
changeset
|
4116 PyErr_SetString(PyExc_TypeError, |
|
d976c9a63111
Make it so TypeError is raised if an instance of an object is put in an
Brett Cannon <bcannon@gmail.com>
parents:
40943
diff
changeset
|
4117 CANNOT_CATCH_MSG); |
|
40942
4b9d0dac79cc
You can no longer catch non-BaseException objects; TypeError is raised if such
Brett Cannon <bcannon@gmail.com>
parents:
40937
diff
changeset
|
4118 return NULL; |
|
40742
f1701ba2452b
Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40729
diff
changeset
|
4119 } |
|
f1701ba2452b
Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40729
diff
changeset
|
4120 } |
|
f1701ba2452b
Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40729
diff
changeset
|
4121 } |
|
f1701ba2452b
Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40729
diff
changeset
|
4122 else { |
|
40946
d976c9a63111
Make it so TypeError is raised if an instance of an object is put in an
Brett Cannon <bcannon@gmail.com>
parents:
40943
diff
changeset
|
4123 if (!PyExceptionClass_Check(w)) { |
|
d976c9a63111
Make it so TypeError is raised if an instance of an object is put in an
Brett Cannon <bcannon@gmail.com>
parents:
40943
diff
changeset
|
4124 PyErr_SetString(PyExc_TypeError, |
|
d976c9a63111
Make it so TypeError is raised if an instance of an object is put in an
Brett Cannon <bcannon@gmail.com>
parents:
40943
diff
changeset
|
4125 CANNOT_CATCH_MSG); |
|
40942
4b9d0dac79cc
You can no longer catch non-BaseException objects; TypeError is raised if such
Brett Cannon <bcannon@gmail.com>
parents:
40937
diff
changeset
|
4126 return NULL; |
|
40742
f1701ba2452b
Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40729
diff
changeset
|
4127 } |
|
f1701ba2452b
Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40729
diff
changeset
|
4128 } |
|
6147
b76a44163e0f
cmp_exception gets promoted (essentially) to the C API function
Barry Warsaw <barry@python.org>
parents:
6139
diff
changeset
|
4129 res = PyErr_GivenExceptionMatches(v, w); |
| 69 | 4130 break; |
| 4131 default: | |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
4132 return PyObject_RichCompare(v, w, op); |
| 69 | 4133 } |
| 5368 | 4134 v = res ? Py_True : Py_False; |
| 4135 Py_INCREF(v); | |
| 69 | 4136 return v; |
| 4137 } | |
| 4138 | |
|
14038
18385172fac0
Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents:
13930
diff
changeset
|
4139 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
|
4140 import_from(PyObject *v, PyObject *name) |
|
72
5e8a0b40a4bd
Free parse tree after compiling.
Guido van Rossum <guido@python.org>
parents:
69
diff
changeset
|
4141 { |
|
15830
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4142 PyObject *x; |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4143 |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4144 x = PyObject_GetAttr(v, name); |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4145 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) { |
|
41878
089f449a20cd
Change PyErr_Format() to generate a unicode string (by using
Walter Dörwald <walter@livinglogic.de>
parents:
41824
diff
changeset
|
4146 PyErr_Format(PyExc_ImportError, "cannot import name %S", name); |
|
15830
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4147 } |
|
14038
18385172fac0
Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents:
13930
diff
changeset
|
4148 return x; |
|
18385172fac0
Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents:
13930
diff
changeset
|
4149 } |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
4150 |
|
14038
18385172fac0
Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents:
13930
diff
changeset
|
4151 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
|
4152 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
|
4153 { |
|
15830
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4154 PyObject *all = PyObject_GetAttrString(v, "__all__"); |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4155 PyObject *dict, *name, *value; |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4156 int skip_leading_underscores = 0; |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4157 int pos, err; |
|
14038
18385172fac0
Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents:
13930
diff
changeset
|
4158 |
|
15830
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4159 if (all == NULL) { |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4160 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4161 return -1; /* Unexpected error */ |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4162 PyErr_Clear(); |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4163 dict = PyObject_GetAttrString(v, "__dict__"); |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4164 if (dict == NULL) { |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4165 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4166 return -1; |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4167 PyErr_SetString(PyExc_ImportError, |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4168 "from-import-* object has no __dict__ and no __all__"); |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4169 return -1; |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4170 } |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4171 all = PyMapping_Keys(dict); |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4172 Py_DECREF(dict); |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4173 if (all == NULL) |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4174 return -1; |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4175 skip_leading_underscores = 1; |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2006
diff
changeset
|
4176 } |
|
14038
18385172fac0
Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents:
13930
diff
changeset
|
4177 |
|
15830
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4178 for (pos = 0, err = 0; ; pos++) { |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4179 name = PySequence_GetItem(all, pos); |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4180 if (name == NULL) { |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4181 if (!PyErr_ExceptionMatches(PyExc_IndexError)) |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4182 err = -1; |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4183 else |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4184 PyErr_Clear(); |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4185 break; |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4186 } |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4187 if (skip_leading_underscores && |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41969
diff
changeset
|
4188 PyUnicode_Check(name) && |
|
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41969
diff
changeset
|
4189 PyUnicode_AS_UNICODE(name)[0] == '_') |
|
15830
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4190 { |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4191 Py_DECREF(name); |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4192 continue; |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4193 } |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4194 value = PyObject_GetAttr(v, name); |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4195 if (value == NULL) |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4196 err = -1; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40381
diff
changeset
|
4197 else if (PyDict_CheckExact(locals)) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40381
diff
changeset
|
4198 err = PyDict_SetItem(locals, name, value); |
|
15830
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4199 else |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40381
diff
changeset
|
4200 err = PyObject_SetItem(locals, name, value); |
|
15830
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4201 Py_DECREF(name); |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4202 Py_XDECREF(value); |
|
14038
18385172fac0
Apply SF patch #101135, adding 'import module as m' and 'from module import
Thomas Wouters <thomas@python.org>
parents:
13930
diff
changeset
|
4203 if (err != 0) |
|
15830
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4204 break; |
|
72
5e8a0b40a4bd
Free parse tree after compiling.
Guido van Rossum <guido@python.org>
parents:
69
diff
changeset
|
4205 } |
|
15830
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4206 Py_DECREF(all); |
|
e00f718e4d8a
Two changes to from...import:
Guido van Rossum <guido@python.org>
parents:
15814
diff
changeset
|
4207 return err; |
|
72
5e8a0b40a4bd
Free parse tree after compiling.
Guido van Rossum <guido@python.org>
parents:
69
diff
changeset
|
4208 } |
|
5e8a0b40a4bd
Free parse tree after compiling.
Guido van Rossum <guido@python.org>
parents:
69
diff
changeset
|
4209 |
|
15948
3bc2440427d3
Rich comparisons fall-out:
Guido van Rossum <guido@python.org>
parents:
15899
diff
changeset
|
4210 static void |
| 42860 | 4211 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
|
4212 { |
| 42860 | 4213 const char *obj_str; |
|
14268
cd8b815cb196
Better error message with UnboundLocalError
Paul Prescod <prescod@prescod.net>
parents:
14238
diff
changeset
|
4214 |
|
cd8b815cb196
Better error message with UnboundLocalError
Paul Prescod <prescod@prescod.net>
parents:
14238
diff
changeset
|
4215 if (!obj) |
|
cd8b815cb196
Better error message with UnboundLocalError
Paul Prescod <prescod@prescod.net>
parents:
14238
diff
changeset
|
4216 return; |
|
cd8b815cb196
Better error message with UnboundLocalError
Paul Prescod <prescod@prescod.net>
parents:
14238
diff
changeset
|
4217 |
|
48660
85b67fb5672b
Rename PyUnicode_AsString -> _PyUnicode_AsString and
Marc-André Lemburg <mal@egenix.com>
parents:
48574
diff
changeset
|
4218 obj_str = _PyUnicode_AsString(obj); |
|
14268
cd8b815cb196
Better error message with UnboundLocalError
Paul Prescod <prescod@prescod.net>
parents:
14238
diff
changeset
|
4219 if (!obj_str) |
|
cd8b815cb196
Better error message with UnboundLocalError
Paul Prescod <prescod@prescod.net>
parents:
14238
diff
changeset
|
4220 return; |
|
cd8b815cb196
Better error message with UnboundLocalError
Paul Prescod <prescod@prescod.net>
parents:
14238
diff
changeset
|
4221 |
|
cd8b815cb196
Better error message with UnboundLocalError
Paul Prescod <prescod@prescod.net>
parents:
14238
diff
changeset
|
4222 PyErr_Format(exc, format_str, obj_str); |
|
cd8b815cb196
Better error message with UnboundLocalError
Paul Prescod <prescod@prescod.net>
parents:
14238
diff
changeset
|
4223 } |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4224 |
|
32974
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4225 static PyObject * |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43569
diff
changeset
|
4226 unicode_concatenate(PyObject *v, PyObject *w, |
|
32974
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4227 PyFrameObject *f, unsigned char *next_instr) |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4228 { |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4229 /* This function implements 'variable += expr' when both arguments |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43569
diff
changeset
|
4230 are (Unicode) strings. */ |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43569
diff
changeset
|
4231 Py_ssize_t v_len = PyUnicode_GET_SIZE(v); |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43569
diff
changeset
|
4232 Py_ssize_t w_len = PyUnicode_GET_SIZE(w); |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
39222
diff
changeset
|
4233 Py_ssize_t new_len = v_len + w_len; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
39222
diff
changeset
|
4234 if (new_len < 0) { |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
39222
diff
changeset
|
4235 PyErr_SetString(PyExc_OverflowError, |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
39222
diff
changeset
|
4236 "strings are too large to concat"); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
39222
diff
changeset
|
4237 return NULL; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
39222
diff
changeset
|
4238 } |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
4239 |
|
32974
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4240 if (v->ob_refcnt == 2) { |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4241 /* In the common case, there are 2 references to the value |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4242 * stored in 'variable' when the += is performed: one on the |
|
43418
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
4243 * value stack (in 'v') and one still stored in the |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
4244 * 'variable'. We try to delete the variable now to reduce |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
4245 * the refcnt to 1. |
|
32974
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4246 */ |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4247 switch (*next_instr) { |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4248 case STORE_FAST: |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4249 { |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4250 int oparg = PEEKARG(); |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4251 PyObject **fastlocals = f->f_localsplus; |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4252 if (GETLOCAL(oparg) == v) |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4253 SETLOCAL(oparg, NULL); |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4254 break; |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4255 } |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4256 case STORE_DEREF: |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4257 { |
|
43418
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
4258 PyObject **freevars = (f->f_localsplus + |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
4259 f->f_code->co_nlocals); |
|
32974
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4260 PyObject *c = freevars[PEEKARG()]; |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4261 if (PyCell_GET(c) == v) |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4262 PyCell_Set(c, NULL); |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4263 break; |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4264 } |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4265 case STORE_NAME: |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4266 { |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4267 PyObject *names = f->f_code->co_names; |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4268 PyObject *name = GETITEM(names, PEEKARG()); |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4269 PyObject *locals = f->f_locals; |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4270 if (PyDict_CheckExact(locals) && |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4271 PyDict_GetItem(locals, name) == v) { |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4272 if (PyDict_DelItem(locals, name) != 0) { |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4273 PyErr_Clear(); |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4274 } |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4275 } |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4276 break; |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4277 } |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4278 } |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4279 } |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4280 |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43569
diff
changeset
|
4281 if (v->ob_refcnt == 1 && !PyUnicode_CHECK_INTERNED(v)) { |
|
32974
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4282 /* Now we own the last reference to 'v', so we can resize it |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4283 * in-place. |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4284 */ |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43569
diff
changeset
|
4285 if (PyUnicode_Resize(&v, new_len) != 0) { |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43569
diff
changeset
|
4286 /* XXX if PyUnicode_Resize() fails, 'v' has been |
|
43418
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
4287 * deallocated so it cannot be put back into |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
4288 * 'variable'. The MemoryError is raised when there |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
4289 * is no value in 'variable', which might (very |
|
0c8fec76111c
Merged revisions 58211-58220 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43411
diff
changeset
|
4290 * remotely) be a cause of incompatibilities. |
|
32974
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4291 */ |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4292 return NULL; |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4293 } |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4294 /* copy 'w' into the newly allocated area of 'v' */ |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43569
diff
changeset
|
4295 memcpy(PyUnicode_AS_UNICODE(v) + v_len, |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43569
diff
changeset
|
4296 PyUnicode_AS_UNICODE(w), w_len*sizeof(Py_UNICODE)); |
|
32974
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4297 return v; |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4298 } |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4299 else { |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4300 /* When in-place resizing is not an option. */ |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43569
diff
changeset
|
4301 w = PyUnicode_Concat(v, w); |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43569
diff
changeset
|
4302 Py_DECREF(v); |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43569
diff
changeset
|
4303 return w; |
|
32974
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4304 } |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4305 } |
|
fb6ffd290cfb
SF patch #980695: efficient string concatenation
Raymond Hettinger <python@rcn.com>
parents:
32900
diff
changeset
|
4306 |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4307 #ifdef DYNAMIC_EXECUTION_PROFILE |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4308 |
|
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
|
4309 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
4310 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
|
4311 { |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4312 int i; |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4313 PyObject *l = PyList_New(256); |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4314 if (l == NULL) return NULL; |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4315 for (i = 0; i < 256; i++) { |
|
44099
f324631462a2
Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents:
43996
diff
changeset
|
4316 PyObject *x = PyLong_FromLong(a[i]); |
|
5049
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4317 if (x == NULL) { |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4318 Py_DECREF(l); |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4319 return NULL; |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4320 } |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4321 PyList_SetItem(l, i, x); |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4322 } |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4323 for (i = 0; i < 256; i++) |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4324 a[i] = 0; |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4325 return l; |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4326 } |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4327 |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4328 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13620
diff
changeset
|
4329 _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
|
4330 { |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4331 #ifndef DXPAIRS |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4332 return getarray(dxp); |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4333 #else |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4334 int i; |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4335 PyObject *l = PyList_New(257); |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4336 if (l == NULL) return NULL; |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4337 for (i = 0; i < 257; i++) { |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4338 PyObject *x = getarray(dxpairs[i]); |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4339 if (x == NULL) { |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4340 Py_DECREF(l); |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4341 return NULL; |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4342 } |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4343 PyList_SetItem(l, i, x); |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4344 } |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4345 return l; |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4346 #endif |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4347 } |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4348 |
|
946b2b2a7622
Patches for (two forms of) optional dynamic execution profiling --
Guido van Rossum <guido@python.org>
parents:
5048
diff
changeset
|
4349 #endif |
