@@ -76,13 +76,9 @@ do { \
76
76
#define NAME_ERROR_MSG \
77
77
"name '%.200s' is not defined"
78
78
79
- typedef struct {
80
- PyObject * kwnames ;
81
- } CallShape ;
82
-
83
79
// Dummy variables for stack effects.
84
80
static PyObject * value , * value1 , * value2 , * left , * right , * res , * sum , * prod , * sub ;
85
- static PyObject * container , * start , * stop , * v ;
81
+ static PyObject * container , * start , * stop , * v , * lhs , * rhs ;
86
82
87
83
static PyObject *
88
84
dummy_func (
@@ -101,6 +97,8 @@ dummy_func(
101
97
binaryfunc binary_ops []
102
98
)
103
99
{
100
+ _PyInterpreterFrame entry_frame ;
101
+
104
102
switch (opcode ) {
105
103
106
104
// BEGIN BYTECODES //
@@ -193,7 +191,21 @@ dummy_func(
193
191
ERROR_IF (res == NULL , error );
194
192
}
195
193
196
- inst (BINARY_OP_MULTIPLY_INT , (left , right -- prod )) {
194
+ family (binary_op , INLINE_CACHE_ENTRIES_BINARY_OP ) = {
195
+ BINARY_OP ,
196
+ BINARY_OP_ADD_FLOAT ,
197
+ BINARY_OP_ADD_INT ,
198
+ BINARY_OP_ADD_UNICODE ,
199
+ BINARY_OP_GENERIC ,
200
+ // BINARY_OP_INPLACE_ADD_UNICODE, // This is an odd duck.
201
+ BINARY_OP_MULTIPLY_FLOAT ,
202
+ BINARY_OP_MULTIPLY_INT ,
203
+ BINARY_OP_SUBTRACT_FLOAT ,
204
+ BINARY_OP_SUBTRACT_INT ,
205
+ };
206
+
207
+
208
+ inst (BINARY_OP_MULTIPLY_INT , (left , right , unused /1 -- prod )) {
197
209
assert (cframe .use_tracing == 0 );
198
210
DEOPT_IF (!PyLong_CheckExact (left ), BINARY_OP );
199
211
DEOPT_IF (!PyLong_CheckExact (right ), BINARY_OP );
@@ -202,10 +214,9 @@ dummy_func(
202
214
_Py_DECREF_SPECIALIZED (right , (destructor )PyObject_Free );
203
215
_Py_DECREF_SPECIALIZED (left , (destructor )PyObject_Free );
204
216
ERROR_IF (prod == NULL , error );
205
- JUMPBY (INLINE_CACHE_ENTRIES_BINARY_OP );
206
217
}
207
218
208
- inst (BINARY_OP_MULTIPLY_FLOAT , (left , right -- prod )) {
219
+ inst (BINARY_OP_MULTIPLY_FLOAT , (left , right , unused / 1 -- prod )) {
209
220
assert (cframe .use_tracing == 0 );
210
221
DEOPT_IF (!PyFloat_CheckExact (left ), BINARY_OP );
211
222
DEOPT_IF (!PyFloat_CheckExact (right ), BINARY_OP );
@@ -216,10 +227,9 @@ dummy_func(
216
227
_Py_DECREF_SPECIALIZED (right , _PyFloat_ExactDealloc );
217
228
_Py_DECREF_SPECIALIZED (left , _PyFloat_ExactDealloc );
218
229
ERROR_IF (prod == NULL , error );
219
- JUMPBY (INLINE_CACHE_ENTRIES_BINARY_OP );
220
230
}
221
231
222
- inst (BINARY_OP_SUBTRACT_INT , (left , right -- sub )) {
232
+ inst (BINARY_OP_SUBTRACT_INT , (left , right , unused / 1 -- sub )) {
223
233
assert (cframe .use_tracing == 0 );
224
234
DEOPT_IF (!PyLong_CheckExact (left ), BINARY_OP );
225
235
DEOPT_IF (!PyLong_CheckExact (right ), BINARY_OP );
@@ -228,10 +238,9 @@ dummy_func(
228
238
_Py_DECREF_SPECIALIZED (right , (destructor )PyObject_Free );
229
239
_Py_DECREF_SPECIALIZED (left , (destructor )PyObject_Free );
230
240
ERROR_IF (sub == NULL , error );
231
- JUMPBY (INLINE_CACHE_ENTRIES_BINARY_OP );
232
241
}
233
242
234
- inst (BINARY_OP_SUBTRACT_FLOAT , (left , right -- sub )) {
243
+ inst (BINARY_OP_SUBTRACT_FLOAT , (left , right , unused / 1 -- sub )) {
235
244
assert (cframe .use_tracing == 0 );
236
245
DEOPT_IF (!PyFloat_CheckExact (left ), BINARY_OP );
237
246
DEOPT_IF (!PyFloat_CheckExact (right ), BINARY_OP );
@@ -241,10 +250,9 @@ dummy_func(
241
250
_Py_DECREF_SPECIALIZED (right , _PyFloat_ExactDealloc );
242
251
_Py_DECREF_SPECIALIZED (left , _PyFloat_ExactDealloc );
243
252
ERROR_IF (sub == NULL , error );
244
- JUMPBY (INLINE_CACHE_ENTRIES_BINARY_OP );
245
253
}
246
254
247
- inst (BINARY_OP_ADD_UNICODE , (left , right -- res )) {
255
+ inst (BINARY_OP_ADD_UNICODE , (left ,
1E0A
right , unused / 1 -- res )) {
248
256
assert (cframe .use_tracing == 0 );
249
257
DEOPT_IF (!PyUnicode_CheckExact (left ), BINARY_OP );
250
258
DEOPT_IF (Py_TYPE (right ) != Py_TYPE (left ), BINARY_OP );
@@ -253,7 +261,6 @@ dummy_func(
253
261
_Py_DECREF_SPECIALIZED (left , _PyUnicode_ExactDealloc );
254
262
_Py_DECREF_SPECIALIZED (right , _PyUnicode_ExactDealloc );
255
263
ERROR_IF (res == NULL , error );
256
- JUMPBY (INLINE_CACHE_ENTRIES_BINARY_OP );
257
264
}
258
265
259
266
// This is a subtle one. It's a super-instruction for
@@ -292,7 +299,7 @@ dummy_func(
292
299
JUMPBY (INLINE_CACHE_ENTRIES_BINARY_OP + 1 );
293
300
}
294
301
295
- inst (BINARY_OP_ADD_FLOAT , (left , right -- sum )) {
302
+ inst (BINARY_OP_ADD_FLOAT , (left , right , unused / 1 -- sum )) {
296
303
assert (cframe .use_tracing == 0 );
297
304
DEOPT_IF (!PyFloat_CheckExact (left ), BINARY_OP );
298
305
DEOPT_IF (Py_TYPE (right ) != Py_TYPE (left ), BINARY_OP );
@@ -303,10 +310,9 @@ dummy_func(
303
310
_Py_DECREF_SPECIALIZED (right , _PyFloat_ExactDealloc );
304
311
_Py_DECREF_SPECIALIZED (left , _PyFloat_ExactDealloc );
305
312
ERROR_IF (sum == NULL , error );
306
- JUMPBY (INLINE_CACHE_ENTRIES_BINARY_OP );
307
313
}
308
314
309
- inst (BINARY_OP_ADD_INT , (left , right -- sum )) {
315
+ inst (BINARY_OP_ADD_INT , (left , right , unused / 1 -- sum )) {
310
316
assert (cframe .use_tracing == 0 );
311
317
DEOPT_IF (!PyLong_CheckExact (left ), BINARY_OP );
312
318
DEOPT_IF (Py_TYPE (right ) != Py_TYPE (left ), BINARY_OP );
@@ -315,7 +321,6 @@ dummy_func(
315
321
_Py_DECREF_SPECIALIZED (right , (destructor )PyObject_Free );
316
322
_Py_DECREF_SPECIALIZED (left , (destructor )PyObject_Free );
317
323
ERROR_IF (sum == NULL , error );
318
- JUMPBY (INLINE_CACHE_ENTRIES_BINARY_OP );
319
324
}
320
325
321
326
inst (BINARY_SUBSCR , (container , sub -- res )) {
@@ -3691,30 +3696,21 @@ dummy_func(
3691
3696
PUSH (Py_NewRef (peek ));
3692
3697
}
3693
3698
3694
- // stack effect: (__0 -- )
3695
- inst (BINARY_OP_GENERIC ) {
3696
- PyObject * rhs = POP ();
3697
- PyObject * lhs = TOP ();
3699
+ inst (BINARY_OP_GENERIC , (lhs , rhs , unused /1 -- res )) {
3698
3700
assert (0 <= oparg );
3699
3701
assert ((unsigned )oparg < Py_ARRAY_LENGTH (binary_ops ));
3700
3702
assert (binary_ops [oparg ]);
3701
- PyObject * res = binary_ops [oparg ](lhs , rhs );
3703
+ res = binary_ops [oparg ](lhs , rhs );
3702
3704
Py_DECREF (lhs );
3703
3705
Py_DECREF (rhs );
3704
- SET_TOP (res );
3705
- if (res == NULL ) {
3706
- goto error ;
3707
- }
3708
- JUMPBY (INLINE_CACHE_ENTRIES_BINARY_OP );
3706
+ ERROR_IF (res == NULL , error );
3709
3707
}
3710
3708
3711
- // stack effect: (__0 -- )
3712
- inst (BINARY_OP ) {
3709
+ // This always dispatches, so the result is unused.
3710
+ inst (BINARY_OP , ( lhs , rhs , unused / 1 -- unused ) ) {
3713
3711
_PyBinaryOpCache * cache = (_PyBinaryOpCache * )next_instr ;
3714
3712
if (ADAPTIVE_COUNTER_IS_ZERO (cache -> counter )) {
3715
3713
assert (cframe .use_tracing == 0 );
3716
- PyObject * lhs = SECOND ();
3717
- PyObject * rhs = TOP ();
3718
3714
next_instr -- ;
3719
3715
_Py_Specialize_BinaryOp (lhs , rhs , next_instr , oparg , & GETLOCAL (0 ));
3720
3716
DISPATCH_SAME_OPARG ();
@@ -3761,13 +3757,8 @@ dummy_func(
3761
3757
;
3762
3758
}
3763
3759
3764
- // Families go below this point //
3760
+ // Future families go below this point //
3765
3761
3766
- family (binary_op ) = {
3767
- BINARY_OP , BINARY_OP_ADD_FLOAT ,
3768
- BINARY_OP_ADD_INT , BINARY_OP_ADD_UNICODE , BINARY_OP_GENERIC , BINARY_OP_INPLACE_ADD_UNICODE ,
3769
- BINARY_OP_MULTIPLY_FLOAT , BINARY_OP_MULTIPLY_INT , BINARY_OP_SUBTRACT_FLOAT ,
3770
- BINARY_OP_SUBTRACT_INT };
3771
3762
family (binary_subscr ) = {
3772
3763
BINARY_SUBSCR , BINARY_SUBSCR_DICT ,
3773
3764
BINARY_SUBSCR_GETITEM , BINARY_SUBSCR_LIST_INT , BINARY_SUBSCR_TUPLE_INT };
0 commit comments