Skip to content

Commit 8f70e0b

Browse files
committed
gh-100165: Add BINARY_OP_AND_INT for integer & operation.
1 parent cd67c1b commit 8f70e0b

File tree

5 files changed

+26
-6
lines changed

5 files changed

+26
-6
lines changed

Include/internal/pycore_long.h

+1
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

+1
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",
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

+10-6
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

+12
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ dummy_func(
202202
BINARY_OP_MULTIPLY_INT,
203203
BINARY_OP_SUBTRACT_FLOAT,
204204
BINARY_OP_SUBTRACT_INT,
205+
BINARY_OP_AND_INT,
205206
};
206207

207208

@@ -323,6 +324,17 @@ dummy_func(
323324
ERROR_IF(sum == NULL, error);
324325
}
325326

327+
inst(BINARY_OP_AND_INT, (left, right, unused/1 -- and)) {
328+
assert(cframe.use_tracing == 0);
329+
DEOPT_IF(!PyLong_CheckExact(left), BINARY_OP);
330+
DEOPT_IF(Py_TYPE(right) != Py_TYPE(left), BINARY_OP);
331+
STAT_INC(BINARY_OP, hit);
332+
and = _PyLong_And((PyLongObject *)left, (PyLongObject *)right);
333+
_Py_DECREF_SPECIALIZED(right, (destructor)PyObject_Free);
334+
_Py_DECREF_SPECIALIZED(left, (destructor)PyObject_Free);
335+
ERROR_IF(and == NULL, error);
336+
}
337+
326338
family(binary_subscr, INLINE_CACHE_ENTRIES_BINARY_SUBSCR) = {
327339
BINARY_SUBSCR,
328340
BINARY_SUBSCR_DICT,

0 commit comments

Comments
 (0)