mirror of
https://github.com/python/cpython.git
synced 2024-11-30 18:51:15 +01:00
0c1a42cf9c
Create a new bytes object and destroy the old one if it has refcount > 1.
54 lines
1.1 KiB
C
54 lines
1.1 KiB
C
#include "parts.h"
|
|
#include "util.h"
|
|
|
|
|
|
/* Test _PyBytes_Resize() */
|
|
static PyObject *
|
|
bytes_resize(PyObject *Py_UNUSED(module), PyObject *args)
|
|
{
|
|
PyObject *obj;
|
|
Py_ssize_t newsize;
|
|
int new;
|
|
|
|
if (!PyArg_ParseTuple(args, "Onp", &obj, &newsize, &new))
|
|
return NULL;
|
|
|
|
NULLABLE(obj);
|
|
if (new) {
|
|
assert(obj != NULL);
|
|
assert(PyBytes_CheckExact(obj));
|
|
PyObject *newobj = PyBytes_FromStringAndSize(NULL, PyBytes_Size(obj));
|
|
if (newobj == NULL) {
|
|
return NULL;
|
|
}
|
|
memcpy(PyBytes_AsString(newobj), PyBytes_AsString(obj), PyBytes_Size(obj));
|
|
obj = newobj;
|
|
}
|
|
else {
|
|
Py_XINCREF(obj);
|
|
}
|
|
if (_PyBytes_Resize(&obj, newsize) < 0) {
|
|
assert(obj == NULL);
|
|
}
|
|
else {
|
|
assert(obj != NULL);
|
|
}
|
|
return obj;
|
|
}
|
|
|
|
|
|
static PyMethodDef test_methods[] = {
|
|
{"bytes_resize", bytes_resize, METH_VARARGS},
|
|
{NULL},
|
|
};
|
|
|
|
int
|
|
_PyTestCapi_Init_Bytes(PyObject *m)
|
|
{
|
|
if (PyModule_AddFunctions(m, test_methods) < 0) {
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|