From d1e0bf67578f2d0b19bcc171838395c500458ada Mon Sep 17 00:00:00 2001 From: Jukka Lehtosalo Date: Thu, 8 Jan 2026 17:03:54 +0000 Subject: [PATCH 1/3] [mypyc] Remove bytearray code paths from bytes primitives These are now unreachable, since bytearray isn't compatible with bytes. We can add bytearray-specific primitives later. --- mypyc/lib-rt/bytes_ops.c | 38 +++++++++++--------------------------- 1 file changed, 11 insertions(+), 27 deletions(-) diff --git a/mypyc/lib-rt/bytes_ops.c b/mypyc/lib-rt/bytes_ops.c index a9b694116866..2a03e32a013a 100644 --- a/mypyc/lib-rt/bytes_ops.c +++ b/mypyc/lib-rt/bytes_ops.c @@ -50,21 +50,14 @@ CPyTagged CPyBytes_GetItem(PyObject *o, CPyTagged index) { } PyObject *CPyBytes_Concat(PyObject *a, PyObject *b) { - if (PyBytes_Check(a) && PyBytes_Check(b)) { - Py_ssize_t a_len = ((PyVarObject *)a)->ob_size; - Py_ssize_t b_len = ((PyVarObject *)b)->ob_size; - PyBytesObject *ret = (PyBytesObject *)PyBytes_FromStringAndSize(NULL, a_len + b_len); - if (ret != NULL) { - memcpy(ret->ob_sval, ((PyBytesObject *)a)->ob_sval, a_len); - memcpy(ret->ob_sval + a_len, ((PyBytesObject *)b)->ob_sval, b_len); - } - return (PyObject *)ret; - } else if (PyByteArray_Check(a)) { - return PyByteArray_Concat(a, b); - } else { - PyBytes_Concat(&a, b); - return a; + Py_ssize_t a_len = ((PyVarObject *)a)->ob_size; + Py_ssize_t b_len = ((PyVarObject *)b)->ob_size; + PyBytesObject *ret = (PyBytesObject *)PyBytes_FromStringAndSize(NULL, a_len + b_len); + if (ret != NULL) { + memcpy(ret->ob_sval, ((PyBytesObject *)a)->ob_sval, a_len); + memcpy(ret->ob_sval + a_len, ((PyBytesObject *)b)->ob_sval, b_len); } + return (PyObject *)ret; } static inline Py_ssize_t Clamp(Py_ssize_t a, Py_ssize_t b, Py_ssize_t c) { @@ -72,8 +65,7 @@ static inline Py_ssize_t Clamp(Py_ssize_t a, Py_ssize_t b, Py_ssize_t c) { } PyObject *CPyBytes_GetSlice(PyObject *obj, CPyTagged start, CPyTagged end) { - if ((PyBytes_Check(obj) || PyByteArray_Check(obj)) - && CPyTagged_CheckShort(start) && CPyTagged_CheckShort(end)) { + if (CPyTagged_CheckShort(start) && CPyTagged_CheckShort(end)) { Py_ssize_t startn = CPyTagged_ShortAsSsize_t(start); Py_ssize_t endn = CPyTagged_ShortAsSsize_t(end); Py_ssize_t len = ((PyVarObject *)obj)->ob_size; @@ -141,18 +133,10 @@ PyObject *CPyBytes_Build(Py_ssize_t len, ...) { return (PyObject *)ret; } - CPyTagged CPyBytes_Ord(PyObject *obj) { - if (PyBytes_Check(obj)) { - Py_ssize_t s = PyBytes_GET_SIZE(obj); - if (s == 1) { - return (unsigned char)(PyBytes_AS_STRING(obj)[0]) << 1; - } - } else if (PyByteArray_Check(obj)) { - Py_ssize_t s = PyByteArray_GET_SIZE(obj); - if (s == 1) { - return (unsigned char)(PyByteArray_AS_STRING(obj)[0]) << 1; - } + Py_ssize_t s = PyBytes_GET_SIZE(obj); + if (s == 1) { + return (unsigned char)(PyBytes_AS_STRING(obj)[0]) << 1; } PyErr_SetString(PyExc_TypeError, "ord() expects a character"); return CPY_INT_TAG; From 343eb2da2d4f3297975bef61cd05a5bfc9adb641 Mon Sep 17 00:00:00 2001 From: Jukka Lehtosalo Date: Thu, 8 Jan 2026 17:09:56 +0000 Subject: [PATCH 2/3] Fix builtins.bytearray primitive --- mypyc/primitives/bytes_ops.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mypyc/primitives/bytes_ops.py b/mypyc/primitives/bytes_ops.py index 728da4181135..2268acd80aa5 100644 --- a/mypyc/primitives/bytes_ops.py +++ b/mypyc/primitives/bytes_ops.py @@ -51,7 +51,7 @@ function_op( name="builtins.bytearray", arg_types=[object_rprimitive], - return_type=bytes_rprimitive, + return_type=object_rprimitive, c_function_name="PyByteArray_FromObject", error_kind=ERR_MAGIC, ) @@ -74,7 +74,6 @@ ) # bytes + bytes -# bytearray + bytearray binary_op( name="+", arg_types=[bytes_rprimitive, bytes_rprimitive], From 5728ef64e00d39377912c4896478e78bd30f86c3 Mon Sep 17 00:00:00 2001 From: Jukka Lehtosalo Date: Thu, 8 Jan 2026 17:11:23 +0000 Subject: [PATCH 3/3] Update test case --- mypyc/test-data/irbuild-bytes.test | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/mypyc/test-data/irbuild-bytes.test b/mypyc/test-data/irbuild-bytes.test index 0c77c4bfbb69..613ba4e46eee 100644 --- a/mypyc/test-data/irbuild-bytes.test +++ b/mypyc/test-data/irbuild-bytes.test @@ -50,11 +50,7 @@ def f(s, num): num :: int r0 :: object r1 :: str - r2, r3, a :: object - r4 :: bytes - b, r5 :: object - r6 :: bytes - c :: object + r2, r3, a, r4, b, r5, r6, c :: object L0: r0 = builtins :: module r1 = 'bytearray'