diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index fcde77b09ef..85990e0be44 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -1097,6 +1097,18 @@ bytearray_dealloc(PyByteArrayObject *self) #include "stringlib/transmogrify.h" +static PyObject * +bytearray_find(PyByteArrayObject *self, PyObject *args) +{ + return _Py_bytes_find(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args); +} + +static PyObject * +bytearray_count(PyByteArrayObject *self, PyObject *args) +{ + return _Py_bytes_count(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args); +} + /*[clinic input] bytearray.clear @@ -1126,6 +1138,42 @@ bytearray_copy_impl(PyByteArrayObject *self) PyByteArray_GET_SIZE(self)); } +static PyObject * +bytearray_index(PyByteArrayObject *self, PyObject *args) +{ + return _Py_bytes_index(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args); +} + +static PyObject * +bytearray_rfind(PyByteArrayObject *self, PyObject *args) +{ + return _Py_bytes_rfind(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args); +} + +static PyObject * +bytearray_rindex(PyByteArrayObject *self, PyObject *args) +{ + return _Py_bytes_rindex(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args); +} + +static int +bytearray_contains(PyObject *self, PyObject *arg) +{ + return _Py_bytes_contains(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), arg); +} + +static PyObject * +bytearray_startswith(PyByteArrayObject *self, PyObject *args) +{ + return _Py_bytes_startswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args); +} + +static PyObject * +bytearray_endswith(PyByteArrayObject *self, PyObject *args) +{ + return _Py_bytes_endswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args); +} + /*[clinic input] bytearray.translate @@ -1281,8 +1329,8 @@ bytearray_replace_impl(PyByteArrayObject *self, Py_buffer *old, /*[clinic end generated code: output=d39884c4dc59412a input=aa379d988637c7fb]*/ { return stringlib_replace((PyObject *)self, - old->buf, old->len, - new->buf, new->len, count); + (const char *)old->buf, old->len, + (const char *)new->buf, new->len, count); } /*[clinic input] @@ -1947,6 +1995,14 @@ PyDoc_STRVAR(hex__doc__, Create a string of hexadecimal numbers from a bytearray object.\n\ Example: bytearray([0xb9, 0x01, 0xef]).hex() -> 'b901ef'."); +static PyObject * +bytearray_hex(PyBytesObject *self) +{ + char* argbuf = PyByteArray_AS_STRING(self); + Py_ssize_t arglen = PyByteArray_GET_SIZE(self); + return _Py_strhex(argbuf, arglen); +} + static PyObject * _common_reduce(PyByteArrayObject *self, int proto) { @@ -2035,7 +2091,7 @@ static PySequenceMethods bytearray_as_sequence = { 0, /* sq_slice */ (ssizeobjargproc)bytearray_setitem, /* sq_ass_item */ 0, /* sq_ass_slice */ - (objobjproc)stringlib_contains, /* sq_contains */ + (objobjproc)bytearray_contains, /* sq_contains */ (binaryfunc)bytearray_iconcat, /* sq_inplace_concat */ (ssizeargfunc)bytearray_irepeat, /* sq_inplace_repeat */ }; @@ -2063,19 +2119,19 @@ bytearray_methods[] = { {"center", (PyCFunction)stringlib_center, METH_VARARGS, _Py_center__doc__}, BYTEARRAY_CLEAR_METHODDEF BYTEARRAY_COPY_METHODDEF - {"count", (PyCFunction)stringlib_method_count, METH_VARARGS, + {"count", (PyCFunction)bytearray_count, METH_VARARGS, _Py_count__doc__}, BYTEARRAY_DECODE_METHODDEF - {"endswith", (PyCFunction)stringlib_endswith, METH_VARARGS, + {"endswith", (PyCFunction)bytearray_endswith, METH_VARARGS, _Py_endswith__doc__}, {"expandtabs", (PyCFunction)stringlib_expandtabs, METH_VARARGS | METH_KEYWORDS, _Py_expandtabs__doc__}, BYTEARRAY_EXTEND_METHODDEF - {"find", (PyCFunction)stringlib_method_find, METH_VARARGS, + {"find", (PyCFunction)bytearray_find, METH_VARARGS, _Py_find__doc__}, BYTEARRAY_FROMHEX_METHODDEF - {"hex", (PyCFunction)stringlib_hex, METH_NOARGS, hex__doc__}, - {"index", (PyCFunction)stringlib_index, METH_VARARGS, _Py_index__doc__}, + {"hex", (PyCFunction)bytearray_hex, METH_NOARGS, hex__doc__}, + {"index", (PyCFunction)bytearray_index, METH_VARARGS, _Py_index__doc__}, BYTEARRAY_INSERT_METHODDEF {"isalnum", (PyCFunction)stringlib_isalnum, METH_NOARGS, _Py_isalnum__doc__}, @@ -2101,16 +2157,15 @@ bytearray_methods[] = { BYTEARRAY_REMOVE_METHODDEF BYTEARRAY_REPLACE_METHODDEF BYTEARRAY_REVERSE_METHODDEF - {"rfind", (PyCFunction)stringlib_method_rfind, METH_VARARGS, - _Py_rfind__doc__}, - {"rindex", (PyCFunction)stringlib_rindex, METH_VARARGS, _Py_rindex__doc__}, + {"rfind", (PyCFunction)bytearray_rfind, METH_VARARGS, _Py_rfind__doc__}, + {"rindex", (PyCFunction)bytearray_rindex, METH_VARARGS, _Py_rindex__doc__}, {"rjust", (PyCFunction)stringlib_rjust, METH_VARARGS, _Py_rjust__doc__}, BYTEARRAY_RPARTITION_METHODDEF BYTEARRAY_RSPLIT_METHODDEF BYTEARRAY_RSTRIP_METHODDEF BYTEARRAY_SPLIT_METHODDEF BYTEARRAY_SPLITLINES_METHODDEF - {"startswith", (PyCFunction)stringlib_startswith, METH_VARARGS, + {"startswith", (PyCFunction)bytearray_startswith, METH_VARARGS , _Py_startswith__doc__}, BYTEARRAY_STRIP_METHODDEF {"swapcase", (PyCFunction)stringlib_swapcase, METH_NOARGS, diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index 18ee5aa5918..8ad27829347 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -1485,6 +1485,12 @@ bytes_repeat(PyBytesObject *a, Py_ssize_t n) return (PyObject *) op; } +static int +bytes_contains(PyObject *self, PyObject *arg) +{ + return _Py_bytes_contains(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), arg); +} + static PyObject * bytes_item(PyBytesObject *a, Py_ssize_t i) { @@ -1695,7 +1701,7 @@ static PySequenceMethods bytes_as_sequence = { 0, /*sq_slice*/ 0, /*sq_ass_item*/ 0, /*sq_ass_slice*/ - (objobjproc)stringlib_contains /*sq_contains*/ + (objobjproc)bytes_contains /*sq_contains*/ }; static PyMappingMethods bytes_as_mapping = { @@ -1867,6 +1873,32 @@ _PyBytes_Join(PyObject *sep, PyObject *x) return bytes_join((PyBytesObject*)sep, x); } +static PyObject * +bytes_find(PyBytesObject *self, PyObject *args) +{ + return _Py_bytes_find(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), args); +} + +static PyObject * +bytes_index(PyBytesObject *self, PyObject *args) +{ + return _Py_bytes_index(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), args); +} + + +static PyObject * +bytes_rfind(PyBytesObject *self, PyObject *args) +{ + return _Py_bytes_rfind(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), args); +} + + +static PyObject * +bytes_rindex(PyBytesObject *self, PyObject *args) +{ + return _Py_bytes_rindex(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), args); +} + Py_LOCAL_INLINE(PyObject *) do_xstrip(PyBytesObject *self, int striptype, PyObject *sepobj) @@ -2003,6 +2035,13 @@ bytes_rstrip_impl(PyBytesObject *self, PyObject *bytes) } +static PyObject * +bytes_count(PyBytesObject *self, PyObject *args) +{ + return _Py_bytes_count(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), args); +} + + /*[clinic input] bytes.translate @@ -2189,6 +2228,19 @@ bytes_replace_impl(PyBytesObject *self, Py_buffer *old, Py_buffer *new, /** End DALKE **/ +static PyObject * +bytes_startswith(PyBytesObject *self, PyObject *args) +{ + return _Py_bytes_startswith(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), args); +} + +static PyObject * +bytes_endswith(PyBytesObject *self, PyObject *args) +{ + return _Py_bytes_endswith(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), args); +} + + /*[clinic input] bytes.decode @@ -2342,6 +2394,14 @@ PyDoc_STRVAR(hex__doc__, Create a string of hexadecimal numbers from a bytes object.\n\ Example: b'\\xb9\\x01\\xef'.hex() -> 'b901ef'."); +static PyObject * +bytes_hex(PyBytesObject *self) +{ + char* argbuf = PyBytes_AS_STRING(self); + Py_ssize_t arglen = PyBytes_GET_SIZE(self); + return _Py_strhex(argbuf, arglen); +} + static PyObject * bytes_getnewargs(PyBytesObject *v) { @@ -2354,19 +2414,20 @@ bytes_methods[] = { {"__getnewargs__", (PyCFunction)bytes_getnewargs, METH_NOARGS}, {"capitalize", (PyCFunction)stringlib_capitalize, METH_NOARGS, _Py_capitalize__doc__}, - {"center", (PyCFunction)stringlib_center, METH_VARARGS, _Py_center__doc__}, - {"count", (PyCFunction)stringlib_method_count, METH_VARARGS, + {"center", (PyCFunction)stringlib_center, METH_VARARGS, + _Py_center__doc__}, + {"count", (PyCFunction)bytes_count, METH_VARARGS, _Py_count__doc__}, BYTES_DECODE_METHODDEF - {"endswith", (PyCFunction)stringlib_endswith, METH_VARARGS, + {"endswith", (PyCFunction)bytes_endswith, METH_VARARGS, _Py_endswith__doc__}, {"expandtabs", (PyCFunction)stringlib_expandtabs, METH_VARARGS | METH_KEYWORDS, _Py_expandtabs__doc__}, - {"find", (PyCFunction)stringlib_method_find, METH_VARARGS, + {"find", (PyCFunction)bytes_find, METH_VARARGS, _Py_find__doc__}, BYTES_FROMHEX_METHODDEF - {"hex", (PyCFunction)stringlib_hex, METH_NOARGS, hex__doc__}, - {"index", (PyCFunction)stringlib_index, METH_VARARGS, _Py_index__doc__}, + {"hex", (PyCFunction)bytes_hex, METH_NOARGS, hex__doc__}, + {"index", (PyCFunction)bytes_index, METH_VARARGS, _Py_index__doc__}, {"isalnum", (PyCFunction)stringlib_isalnum, METH_NOARGS, _Py_isalnum__doc__}, {"isalpha", (PyCFunction)stringlib_isalpha, METH_NOARGS, @@ -2388,16 +2449,15 @@ bytes_methods[] = { BYTES_MAKETRANS_METHODDEF BYTES_PARTITION_METHODDEF BYTES_REPLACE_METHODDEF - {"rfind", (PyCFunction)stringlib_method_rfind, METH_VARARGS, - _Py_rfind__doc__}, - {"rindex", (PyCFunction)stringlib_rindex, METH_VARARGS, _Py_rindex__doc__}, + {"rfind", (PyCFunction)bytes_rfind, METH_VARARGS, _Py_rfind__doc__}, + {"rindex", (PyCFunction)bytes_rindex, METH_VARARGS, _Py_rindex__doc__}, {"rjust", (PyCFunction)stringlib_rjust, METH_VARARGS, _Py_rjust__doc__}, BYTES_RPARTITION_METHODDEF BYTES_RSPLIT_METHODDEF BYTES_RSTRIP_METHODDEF BYTES_SPLIT_METHODDEF BYTES_SPLITLINES_METHODDEF - {"startswith", (PyCFunction)stringlib_startswith, METH_VARARGS, + {"startswith", (PyCFunction)bytes_startswith, METH_VARARGS, _Py_startswith__doc__}, BYTES_STRIP_METHODDEF {"swapcase", (PyCFunction)stringlib_swapcase, METH_NOARGS, diff --git a/Objects/stringlib/transmogrify.h b/Objects/stringlib/transmogrify.h index fb62d63ba1b..625507ddb1d 100644 --- a/Objects/stringlib/transmogrify.h +++ b/Objects/stringlib/transmogrify.h @@ -2,60 +2,6 @@ # error "transmogrify.h only compatible with byte-wise strings" #endif -Py_LOCAL(PyObject *) -stringlib_method_find(PyObject *self, PyObject *args) -{ - return _Py_bytes_find(STRINGLIB_STR(self), STRINGLIB_LEN(self), args); -} - -Py_LOCAL(PyObject *) -stringlib_index(PyObject *self, PyObject *args) -{ - return _Py_bytes_index(STRINGLIB_STR(self), STRINGLIB_LEN(self), args); -} - -Py_LOCAL(PyObject *) -stringlib_method_rfind(PyObject *self, PyObject *args) -{ - return _Py_bytes_rfind(STRINGLIB_STR(self), STRINGLIB_LEN(self), args); -} - -Py_LOCAL(PyObject *) -stringlib_rindex(PyObject *self, PyObject *args) -{ - return _Py_bytes_rindex(STRINGLIB_STR(self), STRINGLIB_LEN(self), args); -} - -Py_LOCAL(PyObject *) -stringlib_method_count(PyObject *self, PyObject *args) -{ - return _Py_bytes_count(STRINGLIB_STR(self), STRINGLIB_LEN(self), args); -} - -Py_LOCAL(int) -stringlib_contains(PyObject *self, PyObject *arg) -{ - return _Py_bytes_contains(STRINGLIB_STR(self), STRINGLIB_LEN(self), arg); -} - -Py_LOCAL(PyObject *) -stringlib_startswith(PyObject *self, PyObject *args) -{ - return _Py_bytes_startswith(STRINGLIB_STR(self), STRINGLIB_LEN(self), args); -} - -Py_LOCAL(PyObject *) -stringlib_endswith(PyObject *self, PyObject *args) -{ - return _Py_bytes_endswith(STRINGLIB_STR(self), STRINGLIB_LEN(self), args); -} - -Py_LOCAL(PyObject *) -stringlib_hex(PyObject *self) -{ - return _Py_strhex(STRINGLIB_STR(self), STRINGLIB_LEN(self)); -} - /* the more complicated methods. parts of these should be pulled out into the shared code in bytes_methods.c to cut down on duplicate code bloat. */