|
|
|
@ -6298,6 +6298,47 @@ static PyType_Spec HeapCTypeSubclass_spec = { |
|
|
|
HeapCTypeSubclass_slots |
|
|
|
}; |
|
|
|
|
|
|
|
PyDoc_STRVAR(heapctypewithbuffer__doc__, |
|
|
|
"Heap type with buffer support.\n\n" |
|
|
|
"The buffer is set to [b'1', b'2', b'3', b'4']"); |
|
|
|
|
|
|
|
typedef struct { |
|
|
|
HeapCTypeObject base; |
|
|
|
char buffer[4]; |
|
|
|
} HeapCTypeWithBufferObject; |
|
|
|
|
|
|
|
static int |
|
|
|
heapctypewithbuffer_getbuffer(HeapCTypeWithBufferObject *self, Py_buffer *view, int flags) |
|
|
|
{ |
|
|
|
self->buffer[0] = '1'; |
|
|
|
self->buffer[1] = '2'; |
|
|
|
self->buffer[2] = '3'; |
|
|
|
self->buffer[3] = '4'; |
|
|
|
return PyBuffer_FillInfo( |
|
|
|
view, (PyObject*)self, (void *)self->buffer, 4, 1, flags); |
|
|
|
} |
|
|
|
|
|
|
|
static int |
|
|
|
heapctypewithbuffer_releasebuffer(HeapCTypeWithBufferObject *self, Py_buffer *view) |
|
|
|
{ |
|
|
|
assert(view->obj == (void*) self); |
|
|
|
} |
|
|
|
|
|
|
|
static PyType_Slot HeapCTypeWithBuffer_slots[] = { |
|
|
|
{Py_bf_getbuffer, heapctypewithbuffer_getbuffer}, |
|
|
|
{Py_bf_releasebuffer, heapctypewithbuffer_releasebuffer}, |
|
|
|
{Py_tp_doc, (char*)heapctypewithbuffer__doc__}, |
|
|
|
{0, 0}, |
|
|
|
}; |
|
|
|
|
|
|
|
static PyType_Spec HeapCTypeWithBuffer_spec = { |
|
|
|
"_testcapi.HeapCTypeWithBuffer", |
|
|
|
sizeof(HeapCTypeWithBufferObject), |
|
|
|
0, |
|
|
|
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, |
|
|
|
HeapCTypeWithBuffer_slots |
|
|
|
}; |
|
|
|
|
|
|
|
PyDoc_STRVAR(heapctypesubclasswithfinalizer__doc__, |
|
|
|
"Subclass of HeapCType with a finalizer that reassigns __class__.\n\n" |
|
|
|
"__class__ is set to plain HeapCTypeSubclass during finalization.\n" |
|
|
|
@ -6775,6 +6816,12 @@ PyInit__testcapi(void) |
|
|
|
} |
|
|
|
PyModule_AddObject(m, "HeapCTypeWithWeakref", HeapCTypeWithWeakref); |
|
|
|
|
|
|
|
PyObject *HeapCTypeWithBuffer = PyType_FromSpec(&HeapCTypeWithBuffer_spec); |
|
|
|
if (HeapCTypeWithBuffer == NULL) { |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
PyModule_AddObject(m, "HeapCTypeWithBuffer", HeapCTypeWithBuffer); |
|
|
|
|
|
|
|
PyObject *subclass_with_finalizer_bases = PyTuple_Pack(1, HeapCTypeSubclass); |
|
|
|
if (subclass_with_finalizer_bases == NULL) { |
|
|
|
return NULL; |
|
|
|
|