annotate Python/peephole.c @ 73323:dad02a080bbc

Improve byte-compilation in packaging to be independent of -O or -B. The code I fixed to comply with PEP 3147 still had one bug: When run under python -O, some paths for pyc files would be pyo, because I called imp.cache_from_source without explicit debug_override argument in some places, and under -O that would return .pyo (this is well explained in the imp docs). Now all code (util.byte_compile, build_py, install_lib) can create .pyo files according to options given by users, without interference from the calling Python’s own optimize mode. On a related topic, I also removed the code that prevented byte compilation under python -B. The rationale is that packaging gives control over the creation of pyc files to the user with its own explicit option, and the behavior should not be changed if the calling Python happens to run with -B for whatever reason. I will argue that this is a bug fix and ask to be allowed to backport this change to distutils. Finally, I moved one nugget of information about the --compile and --optimize options from the source into the doc. It clears up a misunderstanding that I (and maybe other people) had.
author Éric Araujo <merwok@netwok.org>
date Thu, 03 Nov 2011 05:08:28 +0100
parents 8beaa9a37387
children 3b4f2f9272b4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40943
diff changeset
1 /* Peephole optimizations for bytecode compiler. */
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
2
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
3 #include "Python.h"
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
4
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
5 #include "Python-ast.h"
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
6 #include "node.h"
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
7 #include "ast.h"
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
8 #include "code.h"
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
9 #include "symtable.h"
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
10 #include "opcode.h"
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
11
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
12 #define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
13 #define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
51853
643d8d4fc8eb http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 49747
diff changeset
14 #define CONDITIONAL_JUMP(op) (op==POP_JUMP_IF_FALSE || op==POP_JUMP_IF_TRUE \
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
15 || op==JUMP_IF_FALSE_OR_POP || op==JUMP_IF_TRUE_OR_POP)
51853
643d8d4fc8eb http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 49747
diff changeset
16 #define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP \
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
17 || op==POP_JUMP_IF_FALSE || op==POP_JUMP_IF_TRUE \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
18 || op==JUMP_IF_FALSE_OR_POP || op==JUMP_IF_TRUE_OR_POP)
51853
643d8d4fc8eb http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 49747
diff changeset
19 #define JUMPS_ON_TRUE(op) (op==POP_JUMP_IF_TRUE || op==JUMP_IF_TRUE_OR_POP)
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
20 #define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
21 #define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
22 #define CODESIZE(op) (HAS_ARG(op) ? 3 : 1)
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
23 #define ISBASICBLOCK(blocks, start, bytes) \
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
24 (blocks[start]==blocks[start+bytes-1])
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
25
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
26
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
27 #define CONST_STACK_CREATE() { \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
28 const_stack_size = 256; \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
29 const_stack = PyMem_New(PyObject *, const_stack_size); \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
30 load_const_stack = PyMem_New(Py_ssize_t, const_stack_size); \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
31 if (!const_stack || !load_const_stack) { \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
32 PyErr_NoMemory(); \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
33 goto exitError; \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
34 } \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
35 }
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
36
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
37 #define CONST_STACK_DELETE() do { \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
38 if (const_stack) \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
39 PyMem_Free(const_stack); \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
40 if (load_const_stack) \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
41 PyMem_Free(load_const_stack); \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
42 } while(0)
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
43
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
44 #define CONST_STACK_LEN() (const_stack_top + 1)
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
45
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
46 #define CONST_STACK_PUSH_OP(i) do { \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
47 PyObject *_x; \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
48 assert(codestr[i] == LOAD_CONST); \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
49 assert(PyList_GET_SIZE(consts) > GETARG(codestr, i)); \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
50 _x = PyList_GET_ITEM(consts, GETARG(codestr, i)); \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
51 if (++const_stack_top >= const_stack_size) { \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
52 const_stack_size *= 2; \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
53 PyMem_Resize(const_stack, PyObject *, const_stack_size); \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
54 PyMem_Resize(load_const_stack, Py_ssize_t, const_stack_size); \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
55 if (!const_stack || !load_const_stack) { \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
56 PyErr_NoMemory(); \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
57 goto exitError; \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
58 } \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
59 } \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
60 load_const_stack[const_stack_top] = i; \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
61 const_stack[const_stack_top] = _x; \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
62 in_consts = 1; \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
63 } while(0)
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
64
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
65 #define CONST_STACK_RESET() do { \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
66 const_stack_top = -1; \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
67 } while(0)
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
68
72444
573d73e62bbc Issue #13002: Fix Visual Studio warning (not enough actual parameters).
Stefan Krah <skrah@bytereef.org>
parents: 69372
diff changeset
69 #define CONST_STACK_TOP() \
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
70 const_stack[const_stack_top]
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
71
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
72 #define CONST_STACK_LASTN(i) \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
73 &const_stack[const_stack_top - i + 1]
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
74
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
75 #define CONST_STACK_POP(i) do { \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
76 assert(const_stack_top + 1 >= i); \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
77 const_stack_top -= i; \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
78 } while(0)
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
79
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
80 #define CONST_STACK_OP_LASTN(i) \
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
81 ((const_stack_top >= i - 1) ? load_const_stack[const_stack_top - i + 1] : -1)
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
82
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
83
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
84 /* Replace LOAD_CONST c1. LOAD_CONST c2 ... LOAD_CONST cn BUILD_TUPLE n
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
85 with LOAD_CONST (c1, c2, ... cn).
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
86 The consts table must still be in list form so that the
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
87 new constant (c1, c2, ... cn) can be appended.
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
88 Called with codestr pointing to the first LOAD_CONST.
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
89 Bails out with no change if one or more of the LOAD_CONSTs is missing.
58365
ed8b0ee1c531 Issue #6690: Optimize the bytecode for expressions such as `x in {1, 2, 3}`,
Antoine Pitrou <solipsis@pitrou.net>
parents: 56667
diff changeset
90 Also works for BUILD_LIST and BUILT_SET when followed by an "in" or "not in"
ed8b0ee1c531 Issue #6690: Optimize the bytecode for expressions such as `x in {1, 2, 3}`,
Antoine Pitrou <solipsis@pitrou.net>
parents: 56667
diff changeset
91 test; for BUILD_SET it assembles a frozenset rather than a tuple.
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
92 */
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
93 static int
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
94 tuple_of_constants(unsigned char *codestr, Py_ssize_t n,
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
95 PyObject *consts, PyObject **objs)
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
96 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
97 PyObject *newconst, *constant;
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
98 Py_ssize_t i, len_consts;
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
99
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
100 /* Pre-conditions */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
101 assert(PyList_CheckExact(consts));
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
102
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
103 /* Buildup new tuple of constants */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
104 newconst = PyTuple_New(n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
105 if (newconst == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
106 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
107 len_consts = PyList_GET_SIZE(consts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
108 for (i=0 ; i<n ; i++) {
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
109 constant = objs[i];
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
110 Py_INCREF(constant);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
111 PyTuple_SET_ITEM(newconst, i, constant);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
112 }
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
113
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58365
diff changeset
114 /* If it's a BUILD_SET, use the PyTuple we just built to create a
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58365
diff changeset
115 PyFrozenSet, and use that as the constant instead: */
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
116 if (codestr[0] == BUILD_SET) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58365
diff changeset
117 PyObject *tuple = newconst;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58365
diff changeset
118 newconst = PyFrozenSet_New(tuple);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58365
diff changeset
119 Py_DECREF(tuple);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58365
diff changeset
120 if (newconst == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58365
diff changeset
121 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58365
diff changeset
122 }
58365
ed8b0ee1c531 Issue #6690: Optimize the bytecode for expressions such as `x in {1, 2, 3}`,
Antoine Pitrou <solipsis@pitrou.net>
parents: 56667
diff changeset
123
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
124 /* Append folded constant onto consts */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
125 if (PyList_Append(consts, newconst)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
126 Py_DECREF(newconst);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
127 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
128 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
129 Py_DECREF(newconst);
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
130
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
131 /* Write NOPs over old LOAD_CONSTS and
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
132 add a new LOAD_CONST newconst on top of the BUILD_TUPLE n */
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
133 codestr[0] = LOAD_CONST;
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
134 SETARG(codestr, 0, len_consts);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
135 return 1;
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
136 }
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
137
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
138 /* Replace LOAD_CONST c1. LOAD_CONST c2 BINOP
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
139 with LOAD_CONST binop(c1,c2)
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
140 The consts table must still be in list form so that the
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
141 new constant can be appended.
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
142 Called with codestr pointing to the BINOP.
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
143 Abandons the transformation if the folding fails (i.e. 1+'a').
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
144 If the new constant is a sequence, only folds when the size
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
145 is below a threshold value. That keeps pyc files from
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
146 becoming large in the presence of code like: (None,)*1000.
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
147 */
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
148 static int
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
149 fold_binops_on_constants(unsigned char *codestr, PyObject *consts, PyObject **objs)
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
150 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
151 PyObject *newconst, *v, *w;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
152 Py_ssize_t len_consts, size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
153 int opcode;
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
154
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
155 /* Pre-conditions */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
156 assert(PyList_CheckExact(consts));
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
157
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
158 /* Create new constant */
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
159 v = objs[0];
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
160 w = objs[1];
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
161 opcode = codestr[0];
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
162 switch (opcode) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
163 case BINARY_POWER:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
164 newconst = PyNumber_Power(v, w, Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
165 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
166 case BINARY_MULTIPLY:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
167 newconst = PyNumber_Multiply(v, w);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
168 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
169 case BINARY_TRUE_DIVIDE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
170 newconst = PyNumber_TrueDivide(v, w);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
171 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
172 case BINARY_FLOOR_DIVIDE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
173 newconst = PyNumber_FloorDivide(v, w);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
174 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
175 case BINARY_MODULO:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
176 newconst = PyNumber_Remainder(v, w);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
177 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
178 case BINARY_ADD:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
179 newconst = PyNumber_Add(v, w);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
180 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
181 case BINARY_SUBTRACT:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
182 newconst = PyNumber_Subtract(v, w);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
183 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
184 case BINARY_SUBSCR:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
185 newconst = PyObject_GetItem(v, w);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
186 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
187 case BINARY_LSHIFT:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
188 newconst = PyNumber_Lshift(v, w);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
189 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
190 case BINARY_RSHIFT:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
191 newconst = PyNumber_Rshift(v, w);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
192 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
193 case BINARY_AND:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
194 newconst = PyNumber_And(v, w);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
195 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
196 case BINARY_XOR:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
197 newconst = PyNumber_Xor(v, w);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
198 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
199 case BINARY_OR:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
200 newconst = PyNumber_Or(v, w);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
201 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
202 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
203 /* Called with an unknown opcode */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
204 PyErr_Format(PyExc_SystemError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
205 "unexpected binary operation %d on a constant",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
206 opcode);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
207 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
208 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
209 if (newconst == NULL) {
64223
7ff3fa429721 Issue 8403: Don't mask KeyboardInterrupt during peephole operation.
Raymond Hettinger <python@rcn.com>
parents: 61466
diff changeset
210 if(!PyErr_ExceptionMatches(PyExc_KeyboardInterrupt))
7ff3fa429721 Issue 8403: Don't mask KeyboardInterrupt during peephole operation.
Raymond Hettinger <python@rcn.com>
parents: 61466
diff changeset
211 PyErr_Clear();
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
212 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
213 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
214 size = PyObject_Size(newconst);
64223
7ff3fa429721 Issue 8403: Don't mask KeyboardInterrupt during peephole operation.
Raymond Hettinger <python@rcn.com>
parents: 61466
diff changeset
215 if (size == -1) {
7ff3fa429721 Issue 8403: Don't mask KeyboardInterrupt during peephole operation.
Raymond Hettinger <python@rcn.com>
parents: 61466
diff changeset
216 if (PyErr_ExceptionMatches(PyExc_KeyboardInterrupt))
7ff3fa429721 Issue 8403: Don't mask KeyboardInterrupt during peephole operation.
Raymond Hettinger <python@rcn.com>
parents: 61466
diff changeset
217 return 0;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
218 PyErr_Clear();
64223
7ff3fa429721 Issue 8403: Don't mask KeyboardInterrupt during peephole operation.
Raymond Hettinger <python@rcn.com>
parents: 61466
diff changeset
219 } else if (size > 20) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
220 Py_DECREF(newconst);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
221 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
222 }
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
223
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
224 /* Append folded constant into consts table */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
225 len_consts = PyList_GET_SIZE(consts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
226 if (PyList_Append(consts, newconst)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
227 Py_DECREF(newconst);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
228 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
229 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
230 Py_DECREF(newconst);
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
231
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
232 /* Write NOP NOP NOP NOP LOAD_CONST newconst */
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
233 codestr[-2] = LOAD_CONST;
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
234 SETARG(codestr, -2, len_consts);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
235 return 1;
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
236 }
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
237
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
238 static int
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
239 fold_unaryops_on_constants(unsigned char *codestr, PyObject *consts, PyObject *v)
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
240 {
68869
ead9c1b9f547 Issue #11244: Remove outdated peepholer check that was preventing the peepholer from folding -0 and -0.0. Thanks Eugene Toder for the patch.
Mark Dickinson <mdickinson@enthought.com>
parents: 68570
diff changeset
241 PyObject *newconst;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
242 Py_ssize_t len_consts;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
243 int opcode;
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
244
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
245 /* Pre-conditions */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
246 assert(PyList_CheckExact(consts));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
247 assert(codestr[0] == LOAD_CONST);
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
248
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
249 /* Create new constant */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
250 opcode = codestr[3];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
251 switch (opcode) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
252 case UNARY_NEGATIVE:
68869
ead9c1b9f547 Issue #11244: Remove outdated peepholer check that was preventing the peepholer from folding -0 and -0.0. Thanks Eugene Toder for the patch.
Mark Dickinson <mdickinson@enthought.com>
parents: 68570
diff changeset
253 newconst = PyNumber_Negative(v);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
254 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
255 case UNARY_INVERT:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
256 newconst = PyNumber_Invert(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
257 break;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58365
diff changeset
258 case UNARY_POSITIVE:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58365
diff changeset
259 newconst = PyNumber_Positive(v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58365
diff changeset
260 break;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
261 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
262 /* Called with an unknown opcode */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
263 PyErr_Format(PyExc_SystemError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
264 "unexpected unary operation %d on a constant",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
265 opcode);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
266 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
267 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
268 if (newconst == NULL) {
64223
7ff3fa429721 Issue 8403: Don't mask KeyboardInterrupt during peephole operation.
Raymond Hettinger <python@rcn.com>
parents: 61466
diff changeset
269 if(!PyErr_ExceptionMatches(PyExc_KeyboardInterrupt))
7ff3fa429721 Issue 8403: Don't mask KeyboardInterrupt during peephole operation.
Raymond Hettinger <python@rcn.com>
parents: 61466
diff changeset
270 PyErr_Clear();
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
271 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
272 }
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
273
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
274 /* Append folded constant into consts table */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
275 len_consts = PyList_GET_SIZE(consts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
276 if (PyList_Append(consts, newconst)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
277 Py_DECREF(newconst);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
278 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
279 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
280 Py_DECREF(newconst);
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
281
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
282 /* Write NOP LOAD_CONST newconst */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
283 codestr[0] = NOP;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
284 codestr[1] = LOAD_CONST;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
285 SETARG(codestr, 1, len_consts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
286 return 1;
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
287 }
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
288
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
289 static unsigned int *
46084
6bea2f1351b1 Merged revisions 61834,61841-61842,61851-61853,61863-61864,61869-61870,61874,61889 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45515
diff changeset
290 markblocks(unsigned char *code, Py_ssize_t len)
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
291 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
292 unsigned int *blocks = (unsigned int *)PyMem_Malloc(len*sizeof(int));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
293 int i,j, opcode, blockcnt = 0;
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
294
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
295 if (blocks == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
296 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
297 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
298 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
299 memset(blocks, 0, len*sizeof(int));
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
300
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
301 /* Mark labels in the first pass */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
302 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
303 opcode = code[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
304 switch (opcode) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
305 case FOR_ITER:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
306 case JUMP_FORWARD:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
307 case JUMP_IF_FALSE_OR_POP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
308 case JUMP_IF_TRUE_OR_POP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
309 case POP_JUMP_IF_FALSE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
310 case POP_JUMP_IF_TRUE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
311 case JUMP_ABSOLUTE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
312 case CONTINUE_LOOP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
313 case SETUP_LOOP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
314 case SETUP_EXCEPT:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
315 case SETUP_FINALLY:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58365
diff changeset
316 case SETUP_WITH:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
317 j = GETJUMPTGT(code, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
318 blocks[j] = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
319 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
320 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
321 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
322 /* Build block numbers in the second pass */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
323 for (i=0 ; i<len ; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
324 blockcnt += blocks[i]; /* increment blockcnt over labels */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
325 blocks[i] = blockcnt;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
326 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
327 return blocks;
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
328 }
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
329
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
330 /* Helper to replace LOAD_NAME None/True/False with LOAD_CONST
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
331 Returns: 0 if no change, 1 if change, -1 if error */
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
332 static int
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
333 load_global(unsigned char *codestr, Py_ssize_t i, char *name, PyObject *consts)
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
334 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
335 Py_ssize_t j;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
336 PyObject *obj;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
337 if (name == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
338 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
339 if (strcmp(name, "None") == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
340 obj = Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
341 else if (strcmp(name, "True") == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
342 obj = Py_True;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
343 else if (strcmp(name, "False") == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
344 obj = Py_False;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
345 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
346 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
347 for (j = 0; j < PyList_GET_SIZE(consts); j++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
348 if (PyList_GET_ITEM(consts, j) == obj)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
349 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
350 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
351 if (j == PyList_GET_SIZE(consts)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
352 if (PyList_Append(consts, obj) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
353 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
354 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
355 assert(PyList_GET_ITEM(consts, j) == obj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
356 codestr[i] = LOAD_CONST;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
357 SETARG(codestr, i, j);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
358 return 1;
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
359 }
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
360
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
361 /* Perform basic peephole optimizations to components of a code object.
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
362 The consts object should still be in list form to allow new constants
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
363 to be appended.
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
364
40943
c79e6234fb19 Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents: 40450
diff changeset
365 To keep the optimizer simple, it bails out (does nothing) for code that
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
366 has a length over 32,700, and does not calculate extended arguments.
40943
c79e6234fb19 Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents: 40450
diff changeset
367 That allows us to avoid overflow and sign issues. Likewise, it bails when
c79e6234fb19 Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents: 40450
diff changeset
368 the lineno table has complex encoding for gaps >= 255. EXTENDED_ARG can
c79e6234fb19 Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents: 40450
diff changeset
369 appear before MAKE_FUNCTION; in this case both opcodes are skipped.
c79e6234fb19 Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents: 40450
diff changeset
370 EXTENDED_ARG preceding any other opcode causes the optimizer to bail.
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
371
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
372 Optimizations are restricted to simple transformations occuring within a
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
373 single basic block. All transformations keep the code size the same or
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
374 smaller. For those that reduce size, the gaps are initially filled with
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
375 NOPs. Later those NOPs are removed and the jump addresses retargeted in
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
376 a single pass. Line numbering is adjusted accordingly. */
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
377
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
378 PyObject *
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
379 PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
380 PyObject *lineno_obj)
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
381 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
382 Py_ssize_t i, j, codelen;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
383 int nops, h, adj;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
384 int tgt, tgttgt, opcode;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
385 unsigned char *codestr = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
386 unsigned char *lineno;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
387 int *addrmap = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
388 int new_line, cum_orig_line, last_line, tabsiz;
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
389 PyObject **const_stack = NULL;
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
390 Py_ssize_t *load_const_stack = NULL;
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
391 Py_ssize_t const_stack_top = -1;
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
392 Py_ssize_t const_stack_size = 0;
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
393 int in_consts = 0; /* whether we are in a LOAD_CONST sequence */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
394 unsigned int *blocks = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
395 char *name;
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
396
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
397 /* Bail out if an exception is set */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
398 if (PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
399 goto exitError;
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
400
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
401 /* Bypass optimization when the lineno table is too complex */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
402 assert(PyBytes_Check(lineno_obj));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
403 lineno = (unsigned char*)PyBytes_AS_STRING(lineno_obj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
404 tabsiz = PyBytes_GET_SIZE(lineno_obj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
405 if (memchr(lineno, 255, tabsiz) != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
406 goto exitUnchanged;
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
407
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
408 /* Avoid situations where jump retargeting could overflow */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
409 assert(PyBytes_Check(code));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
410 codelen = PyBytes_GET_SIZE(code);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
411 if (codelen > 32700)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
412 goto exitUnchanged;
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
413
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
414 /* Make a modifiable copy of the code string */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
415 codestr = (unsigned char *)PyMem_Malloc(codelen);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
416 if (codestr == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
417 goto exitError;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
418 codestr = (unsigned char *)memcpy(codestr,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
419 PyBytes_AS_STRING(code), codelen);
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
420
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
421 /* Verify that RETURN_VALUE terminates the codestring. This allows
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
422 the various transformation patterns to look ahead several
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
423 instructions without additional checks to make sure they are not
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
424 looking beyond the end of the code string.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
425 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
426 if (codestr[codelen-1] != RETURN_VALUE)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
427 goto exitUnchanged;
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
428
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
429 /* Mapping to new jump targets after NOPs are removed */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
430 addrmap = (int *)PyMem_Malloc(codelen * sizeof(int));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
431 if (addrmap == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
432 goto exitError;
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
433
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
434 blocks = markblocks(codestr, codelen);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
435 if (blocks == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
436 goto exitError;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
437 assert(PyList_Check(consts));
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
438
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
439 CONST_STACK_CREATE();
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
440
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
441 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
442 reoptimize_current:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
443 opcode = codestr[i];
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
444
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
445 if (!in_consts) {
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
446 CONST_STACK_RESET();
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
447 }
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
448 in_consts = 0;
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
449
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
450 switch (opcode) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
451 /* Replace UNARY_NOT POP_JUMP_IF_FALSE
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
452 with POP_JUMP_IF_TRUE */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
453 case UNARY_NOT:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
454 if (codestr[i+1] != POP_JUMP_IF_FALSE
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
455 || !ISBASICBLOCK(blocks,i,4))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
456 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
457 j = GETARG(codestr, i+1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
458 codestr[i] = POP_JUMP_IF_TRUE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
459 SETARG(codestr, i, j);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
460 codestr[i+3] = NOP;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
461 goto reoptimize_current;
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
462
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
463 /* not a is b --> a is not b
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
464 not a in b --> a not in b
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
465 not a is not b --> a is b
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
466 not a not in b --> a in b
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
467 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
468 case COMPARE_OP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
469 j = GETARG(codestr, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
470 if (j < 6 || j > 9 ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
471 codestr[i+3] != UNARY_NOT ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
472 !ISBASICBLOCK(blocks,i,4))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
473 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
474 SETARG(codestr, i, (j^1));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
475 codestr[i+3] = NOP;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
476 break;
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
477
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
478 /* Replace LOAD_GLOBAL/LOAD_NAME None/True/False
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
479 with LOAD_CONST None/True/False */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
480 case LOAD_NAME:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
481 case LOAD_GLOBAL:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
482 j = GETARG(codestr, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
483 name = _PyUnicode_AsString(PyTuple_GET_ITEM(names, j));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
484 h = load_global(codestr, i, name, consts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
485 if (h < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
486 goto exitError;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
487 else if (h == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
488 continue;
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
489 CONST_STACK_PUSH_OP(i);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
490 break;
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
491
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
492 /* Skip over LOAD_CONST trueconst
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
493 POP_JUMP_IF_FALSE xx. This improves
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
494 "while 1" performance. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
495 case LOAD_CONST:
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
496 CONST_STACK_PUSH_OP(i);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
497 j = GETARG(codestr, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
498 if (codestr[i+3] != POP_JUMP_IF_FALSE ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
499 !ISBASICBLOCK(blocks,i,6) ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
500 !PyObject_IsTrue(PyList_GET_ITEM(consts, j)))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
501 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
502 memset(codestr+i, NOP, 6);
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
503 CONST_STACK_RESET();
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
504 break;
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
505
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58365
diff changeset
506 /* Try to fold tuples of constants (includes a case for lists and sets
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
507 which are only used for "in" and "not in" tests).
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
508 Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
509 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
510 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
511 case BUILD_TUPLE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
512 case BUILD_LIST:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58365
diff changeset
513 case BUILD_SET:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
514 j = GETARG(codestr, i);
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
515 if (j == 0)
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
516 break;
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
517 h = CONST_STACK_OP_LASTN(j);
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
518 assert((h >= 0 || CONST_STACK_LEN() < j));
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
519 if (h >= 0 && j > 0 && j <= CONST_STACK_LEN() &&
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
520 ((opcode == BUILD_TUPLE &&
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
521 ISBASICBLOCK(blocks, h, i-h+3)) ||
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58365
diff changeset
522 ((opcode == BUILD_LIST || opcode == BUILD_SET) &&
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
523 codestr[i+3]==COMPARE_OP &&
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
524 ISBASICBLOCK(blocks, h, i-h+6) &&
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
525 (GETARG(codestr,i+3)==6 ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
526 GETARG(codestr,i+3)==7))) &&
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
527 tuple_of_constants(&codestr[i], j, consts, CONST_STACK_LASTN(j))) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
528 assert(codestr[i] == LOAD_CONST);
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
529 memset(&codestr[h], NOP, i - h);
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
530 CONST_STACK_POP(j);
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
531 CONST_STACK_PUSH_OP(i);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
532 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
533 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
534 if (codestr[i+3] != UNPACK_SEQUENCE ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
535 !ISBASICBLOCK(blocks,i,6) ||
68563
912eb87946e0 Issue 11510: Fix BUILD_SET optimizer bug.
Raymond Hettinger <python@rcn.com>
parents: 68257
diff changeset
536 j != GETARG(codestr, i+3) ||
912eb87946e0 Issue 11510: Fix BUILD_SET optimizer bug.
Raymond Hettinger <python@rcn.com>
parents: 68257
diff changeset
537 opcode == BUILD_SET)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
538 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
539 if (j == 1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
540 memset(codestr+i, NOP, 6);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
541 } else if (j == 2) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
542 codestr[i] = ROT_TWO;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
543 memset(codestr+i+1, NOP, 5);
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
544 CONST_STACK_RESET();
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
545 } else if (j == 3) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
546 codestr[i] = ROT_THREE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
547 codestr[i+1] = ROT_TWO;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
548 memset(codestr+i+2, NOP, 4);
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
549 CONST_STACK_RESET();
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
550 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
551 break;
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
552
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
553 /* Fold binary ops on constants.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
554 LOAD_CONST c1 LOAD_CONST c2 BINOP --> LOAD_CONST binop(c1,c2) */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
555 case BINARY_POWER:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
556 case BINARY_MULTIPLY:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
557 case BINARY_TRUE_DIVIDE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
558 case BINARY_FLOOR_DIVIDE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
559 case BINARY_MODULO:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
560 case BINARY_ADD:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
561 case BINARY_SUBTRACT:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
562 case BINARY_SUBSCR:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
563 case BINARY_LSHIFT:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
564 case BINARY_RSHIFT:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
565 case BINARY_AND:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
566 case BINARY_XOR:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
567 case BINARY_OR:
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
568 /* NOTE: LOAD_CONST is saved at `i-2` since it has an arg
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
569 while BINOP hasn't */
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
570 h = CONST_STACK_OP_LASTN(2);
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
571 assert((h >= 0 || CONST_STACK_LEN() < 2));
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
572 if (h >= 0 &&
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
573 ISBASICBLOCK(blocks, h, i-h+1) &&
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
574 fold_binops_on_constants(&codestr[i], consts, CONST_STACK_LASTN(2))) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
575 i -= 2;
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
576 memset(&codestr[h], NOP, i - h);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
577 assert(codestr[i] == LOAD_CONST);
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
578 CONST_STACK_POP(2);
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
579 CONST_STACK_PUSH_OP(i);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
580 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
581 break;
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
582
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
583 /* Fold unary ops on constants.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
584 LOAD_CONST c1 UNARY_OP --> LOAD_CONST unary_op(c) */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
585 case UNARY_NEGATIVE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
586 case UNARY_INVERT:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58365
diff changeset
587 case UNARY_POSITIVE:
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
588 h = CONST_STACK_OP_LASTN(1);
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
589 assert((h >= 0 || CONST_STACK_LEN() < 1));
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
590 if (h >= 0 &&
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
591 ISBASICBLOCK(blocks, h, i-h+1) &&
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
592 fold_unaryops_on_constants(&codestr[i-3], consts, CONST_STACK_TOP())) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
593 i -= 2;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
594 assert(codestr[i] == LOAD_CONST);
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
595 CONST_STACK_POP(1);
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
596 CONST_STACK_PUSH_OP(i);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
597 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
598 break;
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
599
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
600 /* Simplify conditional jump to conditional jump where the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
601 result of the first test implies the success of a similar
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
602 test or the failure of the opposite test.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
603 Arises in code like:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
604 "if a and b:"
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
605 "if a or b:"
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
606 "a and b or c"
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
607 "(a and b) and c"
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
608 x:JUMP_IF_FALSE_OR_POP y y:JUMP_IF_FALSE_OR_POP z
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
609 --> x:JUMP_IF_FALSE_OR_POP z
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
610 x:JUMP_IF_FALSE_OR_POP y y:JUMP_IF_TRUE_OR_POP z
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
611 --> x:POP_JUMP_IF_FALSE y+3
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
612 where y+3 is the instruction following the second test.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
613 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
614 case JUMP_IF_FALSE_OR_POP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
615 case JUMP_IF_TRUE_OR_POP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
616 tgt = GETJUMPTGT(codestr, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
617 j = codestr[tgt];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
618 if (CONDITIONAL_JUMP(j)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
619 /* NOTE: all possible jumps here are
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
620 absolute! */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
621 if (JUMPS_ON_TRUE(j) == JUMPS_ON_TRUE(opcode)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
622 /* The second jump will be
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
623 taken iff the first is. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
624 tgttgt = GETJUMPTGT(codestr, tgt);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
625 /* The current opcode inherits
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
626 its target's stack behaviour */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
627 codestr[i] = j;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
628 SETARG(codestr, i, tgttgt);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
629 goto reoptimize_current;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
630 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
631 /* The second jump is not taken
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
632 if the first is (so jump past
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
633 it), and all conditional
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
634 jumps pop their argument when
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
635 they're not taken (so change
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
636 the first jump to pop its
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
637 argument when it's taken). */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
638 if (JUMPS_ON_TRUE(opcode))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
639 codestr[i] = POP_JUMP_IF_TRUE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
640 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
641 codestr[i] = POP_JUMP_IF_FALSE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
642 SETARG(codestr, i, (tgt + 3));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
643 goto reoptimize_current;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
644 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
645 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
646 /* Intentional fallthrough */
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
647
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
648 /* Replace jumps to unconditional jumps */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
649 case POP_JUMP_IF_FALSE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
650 case POP_JUMP_IF_TRUE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
651 case FOR_ITER:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
652 case JUMP_FORWARD:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
653 case JUMP_ABSOLUTE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
654 case CONTINUE_LOOP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
655 case SETUP_LOOP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
656 case SETUP_EXCEPT:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
657 case SETUP_FINALLY:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58365
diff changeset
658 case SETUP_WITH:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
659 tgt = GETJUMPTGT(codestr, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
660 /* Replace JUMP_* to a RETURN into just a RETURN */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
661 if (UNCONDITIONAL_JUMP(opcode) &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
662 codestr[tgt] == RETURN_VALUE) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
663 codestr[i] = RETURN_VALUE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
664 memset(codestr+i+1, NOP, 2);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
665 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
666 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
667 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
668 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
669 tgttgt = GETJUMPTGT(codestr, tgt);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
670 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
671 opcode = JUMP_ABSOLUTE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
672 if (!ABSOLUTE_JUMP(opcode))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
673 tgttgt -= i + 3; /* Calc relative jump addr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
674 if (tgttgt < 0) /* No backward relative jumps */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
675 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
676 codestr[i] = opcode;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
677 SETARG(codestr, i, tgttgt);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
678 break;
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
679
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
680 case EXTENDED_ARG:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
681 if (codestr[i+3] != MAKE_FUNCTION)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
682 goto exitUnchanged;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
683 /* don't visit MAKE_FUNCTION as GETARG will be wrong */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
684 i += 3;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
685 break;
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
686
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
687 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
688 /* Remove unreachable JUMPs after RETURN */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
689 case RETURN_VALUE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
690 if (i+4 >= codelen)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
691 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
692 if (codestr[i+4] == RETURN_VALUE &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
693 ISBASICBLOCK(blocks,i,5))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
694 memset(codestr+i+1, NOP, 4);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
695 else if (UNCONDITIONAL_JUMP(codestr[i+1]) &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
696 ISBASICBLOCK(blocks,i,4))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
697 memset(codestr+i+1, NOP, 3);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
698 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
699 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
700 }
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
701
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
702 /* Fixup linenotab */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
703 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
704 addrmap[i] = i - nops;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
705 if (codestr[i] == NOP)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
706 nops++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
707 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
708 cum_orig_line = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
709 last_line = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
710 for (i=0 ; i < tabsiz ; i+=2) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
711 cum_orig_line += lineno[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
712 new_line = addrmap[cum_orig_line];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
713 assert (new_line - last_line < 255);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
714 lineno[i] =((unsigned char)(new_line - last_line));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
715 last_line = new_line;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
716 }
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
717
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
718 /* Remove NOPs and fixup jump targets */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
719 for (i=0, h=0 ; i<codelen ; ) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
720 opcode = codestr[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
721 switch (opcode) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
722 case NOP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
723 i++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
724 continue;
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
725
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
726 case JUMP_ABSOLUTE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
727 case CONTINUE_LOOP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
728 case POP_JUMP_IF_FALSE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
729 case POP_JUMP_IF_TRUE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
730 case JUMP_IF_FALSE_OR_POP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
731 case JUMP_IF_TRUE_OR_POP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
732 j = addrmap[GETARG(codestr, i)];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
733 SETARG(codestr, i, j);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
734 break;
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
735
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
736 case FOR_ITER:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
737 case JUMP_FORWARD:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
738 case SETUP_LOOP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
739 case SETUP_EXCEPT:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
740 case SETUP_FINALLY:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58365
diff changeset
741 case SETUP_WITH:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
742 j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
743 SETARG(codestr, i, j);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
744 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
745 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
746 adj = CODESIZE(opcode);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
747 while (adj--)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
748 codestr[h++] = codestr[i++];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
749 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
750 assert(h + nops == codelen);
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
751
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
752 code = PyBytes_FromStringAndSize((char *)codestr, h);
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
753 CONST_STACK_DELETE();
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
754 PyMem_Free(addrmap);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
755 PyMem_Free(codestr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
756 PyMem_Free(blocks);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
757 return code;
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
758
55609
9d40586a6afc Merged revisions 74126,74130-74131,74149,74155,74157,74180-74183,74398 via svnmerge from
Georg Brandl <georg@python.org>
parents: 51923
diff changeset
759 exitError:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
760 code = NULL;
55609
9d40586a6afc Merged revisions 74126,74130-74131,74149,74155,74157,74180-74183,74398 via svnmerge from
Georg Brandl <georg@python.org>
parents: 51923
diff changeset
761
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
762 exitUnchanged:
68375
14205d0fee45 Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
763 CONST_STACK_DELETE();
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
764 if (blocks != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
765 PyMem_Free(blocks);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
766 if (addrmap != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
767 PyMem_Free(addrmap);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
768 if (codestr != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
769 PyMem_Free(codestr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
770 Py_XINCREF(code);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55609
diff changeset
771 return code;
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff changeset
772 }