Issue #27007: The fromhex() class methods of bytes and bytearray subclasses

now return an instance of corresponding subclass.
This commit is contained in:
Serhiy Storchaka 2016-07-01 17:22:31 +03:00
parent cf8b42e904
commit 0855e706aa
5 changed files with 50 additions and 10 deletions

View file

@ -1968,7 +1968,6 @@ bytearray_splitlines_impl(PyByteArrayObject *self, int keepends)
@classmethod
bytearray.fromhex
cls: self(type="PyObject*")
string: unicode
/
@ -1979,10 +1978,15 @@ Example: bytearray.fromhex('B9 01EF') -> bytearray(b'\\xb9\\x01\\xef')
[clinic start generated code]*/
static PyObject *
bytearray_fromhex_impl(PyObject*cls, PyObject *string)
/*[clinic end generated code: output=df3da60129b3700c input=907bbd2d34d9367a]*/
bytearray_fromhex_impl(PyTypeObject *type, PyObject *string)
/*[clinic end generated code: output=8f0f0b6d30fb3ba0 input=f033a16d1fb21f48]*/
{
return _PyBytes_FromHex(string, 1);
PyObject *result = _PyBytes_FromHex(string, type == &PyByteArray_Type);
if (type != &PyByteArray_Type && result != NULL) {
Py_SETREF(result, PyObject_CallFunctionObjArgs((PyObject *)type,
result, NULL));
}
return result;
}
PyDoc_STRVAR(hex__doc__,

View file

@ -2303,7 +2303,12 @@ static PyObject *
bytes_fromhex_impl(PyTypeObject *type, PyObject *string)
/*[clinic end generated code: output=0973acc63661bb2e input=bf4d1c361670acd3]*/
{
return _PyBytes_FromHex(string, 0);
PyObject *result = _PyBytes_FromHex(string, 0);
if (type != &PyBytes_Type && result != NULL) {
Py_SETREF(result, PyObject_CallFunctionObjArgs((PyObject *)type,
result, NULL));
}
return result;
}
PyObject*

View file

@ -636,10 +636,10 @@ PyDoc_STRVAR(bytearray_fromhex__doc__,
{"fromhex", (PyCFunction)bytearray_fromhex, METH_O|METH_CLASS, bytearray_fromhex__doc__},
static PyObject *
bytearray_fromhex_impl(PyObject*cls, PyObject *string);
bytearray_fromhex_impl(PyTypeObject *type, PyObject *string);
static PyObject *
bytearray_fromhex(PyTypeObject *cls, PyObject *arg)
bytearray_fromhex(PyTypeObject *type, PyObject *arg)
{
PyObject *return_value = NULL;
PyObject *string;
@ -647,7 +647,7 @@ bytearray_fromhex(PyTypeObject *cls, PyObject *arg)
if (!PyArg_Parse(arg, "U:fromhex", &string)) {
goto exit;
}
return_value = bytearray_fromhex_impl((PyObject*)cls, string);
return_value = bytearray_fromhex_impl(type, string);
exit:
return return_value;
@ -716,4 +716,4 @@ bytearray_sizeof(PyByteArrayObject *self, PyObject *Py_UNUSED(ignored))
{
return bytearray_sizeof_impl(self);
}
/*[clinic end generated code: output=044a6c26a836bcfe input=a9049054013a1b77]*/
/*[clinic end generated code: output=a32f183ebef159cc input=a9049054013a1b77]*/