Skip to content

Commit d9f292c

Browse files
committed
Eliminate redundant refcounting for BINARY_OP_EXTEND
1 parent 63cc125 commit d9f292c

2 files changed

Lines changed: 15 additions & 3 deletions

File tree

Python/bytecodes.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -829,7 +829,7 @@ dummy_func(
829829
DEOPT_IF(!res);
830830
}
831831

832-
op(_BINARY_OP_EXTEND, (descr/4, left, right -- res)) {
832+
op(_BINARY_OP_EXTEND, (descr/4, left, right -- res, l, r)) {
833833
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
834834
PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
835835
assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5);
@@ -838,12 +838,18 @@ dummy_func(
838838
STAT_INC(BINARY_OP, hit);
839839

840840
PyObject *res_o = d->action(left_o, right_o);
841-
DECREF_INPUTS();
841+
if (res_o == NULL) {
842+
ERROR_NO_POP();
843+
}
842844
res = PyStackRef_FromPyObjectSteal(res_o);
845+
l = left;
846+
r = right;
847+
DEAD(left);
848+
DEAD(right);
843849
}
844850

845851
macro(BINARY_OP_EXTEND) =
846-
unused/1 + _GUARD_BINARY_OP_EXTEND + rewind/-4 + _BINARY_OP_EXTEND;
852+
unused/1 + _GUARD_BINARY_OP_EXTEND + rewind/-4 + _BINARY_OP_EXTEND + POP_TOP + POP_TOP;
847853

848854
macro(BINARY_OP_INPLACE_ADD_UNICODE) =
849855
_GUARD_TOS_UNICODE + _GUARD_NOS_UNICODE + unused/5 + _BINARY_OP_INPLACE_ADD_UNICODE;

Python/optimizer_bytecodes.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,12 @@ dummy_func(void) {
310310
r = right;
311311
}
312312

313+
op(_BINARY_OP_EXTEND, (left, right -- res, l, r)) {
314+
res = sym_new_not_null(ctx);
315+
l = left;
316+
r = right;
317+
}
318+
313319
op(_BINARY_OP_INPLACE_ADD_UNICODE, (left, right -- res)) {
314320
if (sym_is_const(ctx, left) && sym_is_const(ctx, right)) {
315321
assert(PyUnicode_CheckExact(sym_get_const(ctx, left)));

0 commit comments

Comments
 (0)