Skip to content

Commit 382e3af

Browse files
committed
gh-100165: Add BINARY_OP_AND_INT for integer & operation.
1 parent 2e279e8 commit 382e3af

File tree

5 files changed

+26
-6
lines changed

5 files changed

+26
-6
lines changed

Include/internal/pycore_long.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ static inline PyObject* _PyLong_FromUnsignedChar(unsigned char i)
8181
PyObject *_PyLong_Add(PyLongObject *left, PyLongObject *right);
8282
PyObject *_PyLong_Multiply(PyLongObject *left, PyLongObject *right);
8383
PyObject *_PyLong_Subtract(PyLongObject *left, PyLongObject *right);
84+
PyObject *_PyLong_And(PyLongObject *left, PyLongObject *right);
8485

8586
int _PyLong_AssignValue(PyObject **target, Py_ssize_t value);
8687

Lib/opcode.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,7 @@ def pseudo_op(name, op, real_ops):
287287
"BINARY_OP_MULTIPLY_INT",
288288
"BINARY_OP_SUBTRACT_FLOAT",
289289
"BINARY_OP_SUBTRACT_INT",
290+
"BINARY_OP_AND_INT",
290291
],
291292
"BINARY_SUBSCR": [
292293
"BINARY_SUBSCR_DICT",
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Add ``BINARY_OP_AND_INT`` for and operation between int objects. Patch by
2+
Dong-hee Na.

Objects/longobject.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5299,16 +5299,20 @@ long_bitwise(PyLongObject *a,
52995299
return (PyObject *)maybe_small_long(long_normalize(z));
53005300
}
53015301

5302+
PyObject *
5303+
_PyLong_And(PyLongObject *a, PyLongObject *b)
5304+
{
5305+
if (IS_MEDIUM_VALUE(a) && IS_MEDIUM_VALUE(b)) {
5306+
return _PyLong_FromSTwoDigits(medium_value(a) & medium_value(b));
5307+
}
5308+
return long_bitwise(a, '&', b);
5309+
}
5310+
53025311
static PyObject *
53035312
long_and(PyObject *a, PyObject *b)
53045313
{
53055314
CHECK_BINOP(a, b);
5306-
PyLongObject *x = (PyLongObject*)a;
5307-
PyLongObject *y = (PyLongObject*)b;
5308-
if (IS_MEDIUM_VALUE(x) && IS_MEDIUM_VALUE(y)) {
5309-
return _PyLong_FromSTwoDigits(medium_value(x) & medium_value(y));
5310-
}
5311-
return long_bitwise(x, '&', y);
5315+
return _PyLong_And((PyLongObject *)a, (PyLongObject *)b);
53125316
}
53135317

53145318
static PyObject *

Python/bytecodes.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ dummy_func(
211211
BINARY_OP_MULTIPLY_INT,
212212
BINARY_OP_SUBTRACT_FLOAT,
213213
BINARY_OP_SUBTRACT_INT,
214+
BINARY_OP_AND_INT,
214215
};
215216

216217

@@ -332,6 +333,17 @@ dummy_func(
332333
ERROR_IF(sum == NULL, error);
333334
}
334335

336+
inst(BINARY_OP_AND_INT, (left, right, unused/1 -- and)) {
337+
assert(cframe.use_tracing == 0);
338+
DEOPT_IF(!PyLong_CheckExact(left), BINARY_OP);
339+
DEOPT_IF(Py_TYPE(right) != Py_TYPE(left), BINARY_OP);
340+
STAT_INC(BINARY_OP, hit);
341+
and = _PyLong_And((PyLongObject *)left, (PyLongObject *)right);
342+
_Py_DECREF_SPECIALIZED(right, (destructor)PyObject_Free);
343+
_Py_DECREF_SPECIALIZED(left, (destructor)PyObject_Free);
344+
ERROR_IF(and == NULL, error);
345+
}
346+
335347
family(binary_subscr, INLINE_CACHE_ENTRIES_BINARY_SUBSCR) = {
336348
BINARY_SUBSCR,
337349
BINARY_SUBSCR_DICT,

0 commit comments

Comments
 (0)