Mercurial > cpython-lru_cache-weakref
annotate Python/peephole.c @ 87690:66c1c9f32567 default tip
Add use_weakref option to functools.lru_cache
The use_weakref option makes lru_cache create weak references to the function
arguments when creating the cache key, which prevents them from staying in the
memory forever even after all other references to them are gone.
This is a proof of concept for http://bugs.python.org/issue19859
| author | Radomir Dopieralski <devel@sheep.art.pl> |
|---|---|
| date | Tue, 03 Dec 2013 16:02:48 +0100 |
| parents | eea54395797c |
| children |
| 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); |
|
87090
eea54395797c
Issue #19437: Fix fold_unaryops_on_constants() of the peephole optimizer, clear
Victor Stinner <victor.stinner@gmail.com>
parents:
84519
diff
changeset
|
278 PyErr_Clear(); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
279 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
280 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
281 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
|
282 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
283 /* Write NOP LOAD_CONST newconst */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
284 codestr[0] = NOP; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
285 codestr[1] = LOAD_CONST; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
286 SETARG(codestr, 1, len_consts); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
287 return 1; |
|
39610
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 |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
290 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
|
291 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
|
292 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
293 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
|
294 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
|
295 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
296 if (blocks == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
297 PyErr_NoMemory(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
298 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
299 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
300 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
|
301 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
302 /* Mark labels in the first pass */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
303 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
|
304 opcode = code[i]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
305 switch (opcode) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
306 case FOR_ITER: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
307 case JUMP_FORWARD: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
308 case JUMP_IF_FALSE_OR_POP: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
309 case JUMP_IF_TRUE_OR_POP: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
310 case POP_JUMP_IF_FALSE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
311 case POP_JUMP_IF_TRUE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
312 case JUMP_ABSOLUTE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
313 case CONTINUE_LOOP: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
314 case SETUP_LOOP: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
315 case SETUP_EXCEPT: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
316 case SETUP_FINALLY: |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58365
diff
changeset
|
317 case SETUP_WITH: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
318 j = GETJUMPTGT(code, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
319 blocks[j] = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
320 break; |
|
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 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
323 /* 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
|
324 for (i=0 ; i<len ; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
325 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
|
326 blocks[i] = blockcnt; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
327 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
328 return blocks; |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
329 } |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
330 |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
331 /* 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
|
332 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
|
333 to be appended. |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
334 |
|
40943
c79e6234fb19
Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
335 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
|
336 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
|
337 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
|
338 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
|
339 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
|
340 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
|
341 |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
342 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
|
343 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
|
344 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
|
345 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
|
346 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
|
347 |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
348 PyObject * |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
349 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
|
350 PyObject *lineno_obj) |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
351 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
352 Py_ssize_t i, j, codelen; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
353 int nops, h, adj; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
354 int tgt, tgttgt, opcode; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
355 unsigned char *codestr = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
356 unsigned char *lineno; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
357 int *addrmap = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
358 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
|
359 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
|
360 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
|
361 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
|
362 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
|
363 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
|
364 unsigned int *blocks = NULL; |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
365 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
366 /* 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
|
367 if (PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
368 goto exitError; |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
369 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
370 /* 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
|
371 assert(PyBytes_Check(lineno_obj)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
372 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
|
373 tabsiz = PyBytes_GET_SIZE(lineno_obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
374 if (memchr(lineno, 255, tabsiz) != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
375 goto exitUnchanged; |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
376 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
377 /* 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
|
378 assert(PyBytes_Check(code)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
379 codelen = PyBytes_GET_SIZE(code); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
380 if (codelen > 32700) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
381 goto exitUnchanged; |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
382 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
383 /* 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
|
384 codestr = (unsigned char *)PyMem_Malloc(codelen); |
|
84519
a45407fa4a5b
Issue #18408: Fix PyCode_Optimize(): raise a MemoryError on memory allocation
Victor Stinner <victor.stinner@gmail.com>
parents:
80738
diff
changeset
|
385 if (codestr == NULL) { |
|
a45407fa4a5b
Issue #18408: Fix PyCode_Optimize(): raise a MemoryError on memory allocation
Victor Stinner <victor.stinner@gmail.com>
parents:
80738
diff
changeset
|
386 PyErr_NoMemory(); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
387 goto exitError; |
|
84519
a45407fa4a5b
Issue #18408: Fix PyCode_Optimize(): raise a MemoryError on memory allocation
Victor Stinner <victor.stinner@gmail.com>
parents:
80738
diff
changeset
|
388 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
389 codestr = (unsigned char *)memcpy(codestr, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
390 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
|
391 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
392 /* 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
|
393 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
|
394 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
|
395 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
|
396 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
397 if (codestr[codelen-1] != RETURN_VALUE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
398 goto exitUnchanged; |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
399 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
400 /* 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
|
401 addrmap = (int *)PyMem_Malloc(codelen * sizeof(int)); |
|
84519
a45407fa4a5b
Issue #18408: Fix PyCode_Optimize(): raise a MemoryError on memory allocation
Victor Stinner <victor.stinner@gmail.com>
parents:
80738
diff
changeset
|
402 if (addrmap == NULL) { |
|
a45407fa4a5b
Issue #18408: Fix PyCode_Optimize(): raise a MemoryError on memory allocation
Victor Stinner <victor.stinner@gmail.com>
parents:
80738
diff
changeset
|
403 PyErr_NoMemory(); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
404 goto exitError; |
|
84519
a45407fa4a5b
Issue #18408: Fix PyCode_Optimize(): raise a MemoryError on memory allocation
Victor Stinner <victor.stinner@gmail.com>
parents:
80738
diff
changeset
|
405 } |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
406 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
407 blocks = markblocks(codestr, codelen); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
408 if (blocks == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
409 goto exitError; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
410 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
|
411 |
|
68375
14205d0fee45
Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents:
68257
diff
changeset
|
412 CONST_STACK_CREATE(); |
|
14205d0fee45
Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents:
68257
diff
changeset
|
413 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
414 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
|
415 reoptimize_current: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
416 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
|
417 |
|
68375
14205d0fee45
Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents:
68257
diff
changeset
|
418 if (!in_consts) { |
|
14205d0fee45
Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents:
68257
diff
changeset
|
419 CONST_STACK_RESET(); |
|
14205d0fee45
Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents:
68257
diff
changeset
|
420 } |
|
14205d0fee45
Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents:
68257
diff
changeset
|
421 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
|
422 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
423 switch (opcode) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
424 /* 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
|
425 with POP_JUMP_IF_TRUE */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
426 case UNARY_NOT: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
427 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
|
428 || !ISBASICBLOCK(blocks,i,4)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
429 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
430 j = GETARG(codestr, i+1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
431 codestr[i] = POP_JUMP_IF_TRUE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
432 SETARG(codestr, i, j); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
433 codestr[i+3] = NOP; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
434 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
|
435 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
436 /* 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
|
437 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
|
438 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
|
439 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
|
440 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
441 case COMPARE_OP: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
442 j = GETARG(codestr, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
443 if (j < 6 || j > 9 || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
444 codestr[i+3] != UNARY_NOT || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
445 !ISBASICBLOCK(blocks,i,4)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
446 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
447 SETARG(codestr, i, (j^1)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
448 codestr[i+3] = NOP; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
449 break; |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
450 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
451 /* Skip over LOAD_CONST trueconst |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
452 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
|
453 "while 1" performance. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
454 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
|
455 CONST_STACK_PUSH_OP(i); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
456 j = GETARG(codestr, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
457 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
|
458 !ISBASICBLOCK(blocks,i,6) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
459 !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
|
460 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
461 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
|
462 CONST_STACK_RESET(); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
463 break; |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
464 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58365
diff
changeset
|
465 /* 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
|
466 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
|
467 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
|
468 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
|
469 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
|
470 case BUILD_TUPLE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
471 case BUILD_LIST: |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58365
diff
changeset
|
472 case BUILD_SET: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
473 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
|
474 if (j == 0) |
|
14205d0fee45
Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents:
68257
diff
changeset
|
475 break; |
|
14205d0fee45
Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents:
68257
diff
changeset
|
476 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
|
477 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
|
478 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
|
479 ((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
|
480 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
|
481 ((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
|
482 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
|
483 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
|
484 (GETARG(codestr,i+3)==6 || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
485 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
|
486 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
|
487 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
|
488 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
|
489 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
|
490 CONST_STACK_PUSH_OP(i); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
491 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
492 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
493 if (codestr[i+3] != UNPACK_SEQUENCE || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
494 !ISBASICBLOCK(blocks,i,6) || |
|
68563
912eb87946e0
Issue 11510: Fix BUILD_SET optimizer bug.
Raymond Hettinger <python@rcn.com>
parents:
68257
diff
changeset
|
495 j != GETARG(codestr, i+3) || |
|
912eb87946e0
Issue 11510: Fix BUILD_SET optimizer bug.
Raymond Hettinger <python@rcn.com>
parents:
68257
diff
changeset
|
496 opcode == BUILD_SET) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
497 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
498 if (j == 1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
499 memset(codestr+i, NOP, 6); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
500 } else if (j == 2) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
501 codestr[i] = ROT_TWO; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
502 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
|
503 CONST_STACK_RESET(); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
504 } else if (j == 3) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
505 codestr[i] = ROT_THREE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
506 codestr[i+1] = ROT_TWO; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
507 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
|
508 CONST_STACK_RESET(); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
509 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
510 break; |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
511 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
512 /* Fold binary ops on constants. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
513 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
|
514 case BINARY_POWER: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
515 case BINARY_MULTIPLY: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
516 case BINARY_TRUE_DIVIDE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
517 case BINARY_FLOOR_DIVIDE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
518 case BINARY_MODULO: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
519 case BINARY_ADD: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
520 case BINARY_SUBTRACT: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
521 case BINARY_SUBSCR: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
522 case BINARY_LSHIFT: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
523 case BINARY_RSHIFT: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
524 case BINARY_AND: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
525 case BINARY_XOR: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
526 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
|
527 /* 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
|
528 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
|
529 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
|
530 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
|
531 if (h >= 0 && |
|
14205d0fee45
Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents:
68257
diff
changeset
|
532 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
|
533 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
|
534 i -= 2; |
|
68375
14205d0fee45
Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents:
68257
diff
changeset
|
535 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
|
536 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
|
537 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
|
538 CONST_STACK_PUSH_OP(i); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
539 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
540 break; |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
541 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
542 /* Fold unary ops on constants. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
543 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
|
544 case UNARY_NEGATIVE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
545 case UNARY_INVERT: |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58365
diff
changeset
|
546 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
|
547 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
|
548 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
|
549 if (h >= 0 && |
|
14205d0fee45
Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents:
68257
diff
changeset
|
550 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
|
551 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
|
552 i -= 2; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
553 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
|
554 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
|
555 CONST_STACK_PUSH_OP(i); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
556 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
557 break; |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
558 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
559 /* 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
|
560 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
|
561 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
|
562 Arises in code like: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
563 "if a and b:" |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
564 "if a or b:" |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
565 "a and b or c" |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
566 "(a and b) and c" |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
567 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
|
568 --> 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
|
569 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
|
570 --> 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
|
571 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
|
572 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
573 case JUMP_IF_FALSE_OR_POP: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
574 case JUMP_IF_TRUE_OR_POP: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
575 tgt = GETJUMPTGT(codestr, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
576 j = codestr[tgt]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
577 if (CONDITIONAL_JUMP(j)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
578 /* NOTE: all possible jumps here are |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
579 absolute! */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
580 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
|
581 /* The second jump will be |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
582 taken iff the first is. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
583 tgttgt = GETJUMPTGT(codestr, tgt); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
584 /* The current opcode inherits |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
585 its target's stack behaviour */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
586 codestr[i] = j; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
587 SETARG(codestr, i, tgttgt); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
588 goto reoptimize_current; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
589 } else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
590 /* The second jump is not taken |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
591 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
|
592 it), and all conditional |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
593 jumps pop their argument when |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
594 they're not taken (so change |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
595 the first jump to pop its |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
596 argument when it's taken). */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
597 if (JUMPS_ON_TRUE(opcode)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
598 codestr[i] = POP_JUMP_IF_TRUE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
599 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
600 codestr[i] = POP_JUMP_IF_FALSE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
601 SETARG(codestr, i, (tgt + 3)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
602 goto reoptimize_current; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
603 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
604 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
605 /* Intentional fallthrough */ |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
606 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
607 /* Replace jumps to unconditional jumps */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
608 case POP_JUMP_IF_FALSE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
609 case POP_JUMP_IF_TRUE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
610 case FOR_ITER: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
611 case JUMP_FORWARD: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
612 case JUMP_ABSOLUTE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
613 case CONTINUE_LOOP: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
614 case SETUP_LOOP: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
615 case SETUP_EXCEPT: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
616 case SETUP_FINALLY: |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58365
diff
changeset
|
617 case SETUP_WITH: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
618 tgt = GETJUMPTGT(codestr, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
619 /* 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
|
620 if (UNCONDITIONAL_JUMP(opcode) && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
621 codestr[tgt] == RETURN_VALUE) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
622 codestr[i] = RETURN_VALUE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
623 memset(codestr+i+1, NOP, 2); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
624 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
625 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
626 if (!UNCONDITIONAL_JUMP(codestr[tgt])) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
627 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
628 tgttgt = GETJUMPTGT(codestr, tgt); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
629 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
|
630 opcode = JUMP_ABSOLUTE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
631 if (!ABSOLUTE_JUMP(opcode)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
632 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
|
633 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
|
634 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
635 codestr[i] = opcode; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
636 SETARG(codestr, i, tgttgt); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
637 break; |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
638 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
639 case EXTENDED_ARG: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
640 if (codestr[i+3] != MAKE_FUNCTION) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
641 goto exitUnchanged; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
642 /* 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
|
643 i += 3; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
644 break; |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
645 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
646 /* 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
|
647 /* Remove unreachable JUMPs after RETURN */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
648 case RETURN_VALUE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
649 if (i+4 >= codelen) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
650 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
651 if (codestr[i+4] == RETURN_VALUE && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
652 ISBASICBLOCK(blocks,i,5)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
653 memset(codestr+i+1, NOP, 4); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
654 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
|
655 ISBASICBLOCK(blocks,i,4)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
656 memset(codestr+i+1, NOP, 3); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
657 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
658 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
659 } |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
660 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
661 /* Fixup linenotab */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
662 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
|
663 addrmap[i] = i - nops; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
664 if (codestr[i] == NOP) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
665 nops++; |
|
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 cum_orig_line = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
668 last_line = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
669 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
|
670 cum_orig_line += lineno[i]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
671 new_line = addrmap[cum_orig_line]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
672 assert (new_line - last_line < 255); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
673 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
|
674 last_line = new_line; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
675 } |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
676 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
677 /* Remove NOPs and fixup jump targets */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
678 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
|
679 opcode = codestr[i]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
680 switch (opcode) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
681 case NOP: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
682 i++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
683 continue; |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
684 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
685 case JUMP_ABSOLUTE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
686 case CONTINUE_LOOP: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
687 case POP_JUMP_IF_FALSE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
688 case POP_JUMP_IF_TRUE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
689 case JUMP_IF_FALSE_OR_POP: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
690 case JUMP_IF_TRUE_OR_POP: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
691 j = addrmap[GETARG(codestr, i)]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
692 SETARG(codestr, i, j); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
693 break; |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
694 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
695 case FOR_ITER: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
696 case JUMP_FORWARD: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
697 case SETUP_LOOP: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
698 case SETUP_EXCEPT: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
699 case SETUP_FINALLY: |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
58365
diff
changeset
|
700 case SETUP_WITH: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
701 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
|
702 SETARG(codestr, i, j); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
703 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
704 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
705 adj = CODESIZE(opcode); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
706 while (adj--) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
707 codestr[h++] = codestr[i++]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
708 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
709 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
|
710 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
711 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
|
712 CONST_STACK_DELETE(); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
713 PyMem_Free(addrmap); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
714 PyMem_Free(codestr); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
715 PyMem_Free(blocks); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
716 return code; |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
717 |
|
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
|
718 exitError: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
719 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
|
720 |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
721 exitUnchanged: |
|
68375
14205d0fee45
Issue #11244: The peephole optimizer is now able to constant-fold
Antoine Pitrou <solipsis@pitrou.net>
parents:
68257
diff
changeset
|
722 CONST_STACK_DELETE(); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
723 if (blocks != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
724 PyMem_Free(blocks); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
725 if (addrmap != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
726 PyMem_Free(addrmap); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
727 if (codestr != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
728 PyMem_Free(codestr); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
729 Py_XINCREF(code); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55609
diff
changeset
|
730 return code; |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
diff
changeset
|
731 } |
