diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -99,6 +99,12 @@ bytes(cdata) * */ +/*[clinic input] +module ctypes +class ctypes._CData +[clinic start generated code]*/ +/*[clinic end generated code: checksum=da39a3ee5e6b4b0d3255bfef95601890afd80709]*/ + #define PY_SSIZE_T_CLEAN #include "Python.h" @@ -414,25 +420,56 @@ CDataType_from_address(PyObject *type, P return PyCData_AtAddress(type, buf); } -static char from_buffer_doc[] = -"C.from_buffer(object, offset=0) -> C instance\ncreate a C instance from a writeable buffer"; - static int KeepRef(CDataObject *target, Py_ssize_t index, PyObject *keep); +/*[clinic input] +ctypes._CData.from_buffer + + obj: object + offset: Py_ssize_t = 0 + / + +Create an instance from a writeable buffer. +[clinic start generated code]*/ + +PyDoc_STRVAR(ctypes__CData_from_buffer__doc__, +"from_buffer(obj, offset=0)\n" +"Create an instance from a writeable buffer."); + +#define CTYPES__CDATA_FROM_BUFFER_METHODDEF \ + {"from_buffer", (PyCFunction)ctypes__CData_from_buffer, METH_VARARGS, ctypes__CData_from_buffer__doc__}, + static PyObject * -CDataType_from_buffer(PyObject *type, PyObject *args) +ctypes__CData_from_buffer_impl(PyObject *self, PyObject *obj, Py_ssize_t offset); + +static PyObject * +ctypes__CData_from_buffer(PyObject *self, PyObject *args) +{ + PyObject *return_value = NULL; + PyObject *obj; + Py_ssize_t offset = 0; + + if (!PyArg_ParseTuple(args, + "O|n:from_buffer", + &obj, &offset)) + goto exit; + return_value = ctypes__CData_from_buffer_impl(self, obj, offset); + +exit: + return return_value; +} + +static PyObject * +ctypes__CData_from_buffer_impl(PyObject *self, PyObject *obj, Py_ssize_t offset) +/*[clinic end generated code: checksum=e6f3fec7db52b61f5bd28b707656129213c4a14c]*/ { void *buffer; Py_ssize_t buffer_len; - Py_ssize_t offset = 0; - PyObject *obj, *result; - StgDictObject *dict = PyType_stgdict(type); + PyObject *result; + StgDictObject *dict = PyType_stgdict(self); assert (dict); - if (!PyArg_ParseTuple(args, "O|n:from_buffer", &obj, &offset)) - return NULL; - if (-1 == PyObject_AsWriteBuffer(obj, &buffer, &buffer_len)) return NULL; @@ -448,7 +485,7 @@ CDataType_from_buffer(PyObject *type, Py return NULL; } - result = PyCData_AtAddress(type, (char *)buffer + offset); + result = PyCData_AtAddress(self, (char *)buffer + offset); if (result == NULL) return NULL; @@ -459,25 +496,56 @@ CDataType_from_buffer(PyObject *type, Py return result; } -static char from_buffer_copy_doc[] = -"C.from_buffer_copy(object, offset=0) -> C instance\ncreate a C instance from a readable buffer"; - static PyObject * GenericPyCData_new(PyTypeObject *type, PyObject *args, PyObject *kwds); +/*[clinic input] +ctypes._CData.from_buffer_copy + + obj: object + offset: Py_ssize_t = 0 + / + +Create an instance from a readable buffer. +[clinic start generated code]*/ + +PyDoc_STRVAR(ctypes__CData_from_buffer_copy__doc__, +"from_buffer_copy(obj, offset=0)\n" +"Create an instance from a readable buffer."); + +#define CTYPES__CDATA_FROM_BUFFER_COPY_METHODDEF \ + {"from_buffer_copy", (PyCFunction)ctypes__CData_from_buffer_copy, METH_VARARGS, ctypes__CData_from_buffer_copy__doc__}, + static PyObject * -CDataType_from_buffer_copy(PyObject *type, PyObject *args) +ctypes__CData_from_buffer_copy_impl(PyObject *self, PyObject *obj, Py_ssize_t offset); + +static PyObject * +ctypes__CData_from_buffer_copy(PyObject *self, PyObject *args) +{ + PyObject *return_value = NULL; + PyObject *obj; + Py_ssize_t offset = 0; + + if (!PyArg_ParseTuple(args, + "O|n:from_buffer_copy", + &obj, &offset)) + goto exit; + return_value = ctypes__CData_from_buffer_copy_impl(self, obj, offset); + +exit: + return return_value; +} + +static PyObject * +ctypes__CData_from_buffer_copy_impl(PyObject *self, PyObject *obj, Py_ssize_t offset) +/*[clinic end generated code: checksum=bd2a97f3db2066ebbeab1647ae215eee575255b3]*/ { const void *buffer; Py_ssize_t buffer_len; - Py_ssize_t offset = 0; - PyObject *obj, *result; - StgDictObject *dict = PyType_stgdict(type); + PyObject *result; + StgDictObject *dict = PyType_stgdict(self); assert (dict); - if (!PyArg_ParseTuple(args, "O|n:from_buffer", &obj, &offset)) - return NULL; - if (-1 == PyObject_AsReadBuffer(obj, (const void**)&buffer, &buffer_len)) return NULL; @@ -494,7 +562,7 @@ CDataType_from_buffer_copy(PyObject *typ return NULL; } - result = GenericPyCData_new((PyTypeObject *)type, NULL, NULL); + result = GenericPyCData_new((PyTypeObject *)self, NULL, NULL); if (result == NULL) return NULL; memcpy(((CDataObject *)result)->b_ptr, @@ -502,21 +570,51 @@ CDataType_from_buffer_copy(PyObject *typ return result; } -static char in_dll_doc[] = -"C.in_dll(dll, name) -> C instance\naccess a C instance in a dll"; +/*[clinic input] +ctypes._CData.in_dll + + dll: object + name: str + / + +Access an instance in a dll. +[clinic start generated code]*/ + +PyDoc_STRVAR(ctypes__CData_in_dll__doc__, +"in_dll(dll, name)\n" +"Access an instance in a dll."); + +#define CTYPES__CDATA_IN_DLL_METHODDEF \ + {"in_dll", (PyCFunction)ctypes__CData_in_dll, METH_VARARGS, ctypes__CData_in_dll__doc__}, static PyObject * -CDataType_in_dll(PyObject *type, PyObject *args) +ctypes__CData_in_dll_impl(PyObject *self, PyObject *dll, const char *name); + +static PyObject * +ctypes__CData_in_dll(PyObject *self, PyObject *args) { + PyObject *return_value = NULL; PyObject *dll; - char *name; + const char *name; + + if (!PyArg_ParseTuple(args, + "Os:in_dll", + &dll, &name)) + goto exit; + return_value = ctypes__CData_in_dll_impl(self, dll, name); + +exit: + return return_value; +} + +static PyObject * +ctypes__CData_in_dll_impl(PyObject *self, PyObject *dll, const char *name) +/*[clinic end generated code: checksum=104cfe5c306695d02999f77786e2ae553587892a]*/ +{ PyObject *obj; void *handle; void *address; - if (!PyArg_ParseTuple(args, "Os:in_dll", &dll, &name)) - return NULL; - obj = PyObject_GetAttrString(dll, "_handle"); if (!obj) return NULL; @@ -556,7 +654,7 @@ CDataType_in_dll(PyObject *type, PyObjec return NULL; } #endif - return PyCData_AtAddress(type, address); + return PyCData_AtAddress(self, address); } static char from_param_doc[] = @@ -614,9 +712,9 @@ CDataType_from_param(PyObject *type, PyO static PyMethodDef CDataType_methods[] = { { "from_param", CDataType_from_param, METH_O, from_param_doc }, { "from_address", CDataType_from_address, METH_O, from_address_doc }, - { "from_buffer", CDataType_from_buffer, METH_VARARGS, from_buffer_doc, }, - { "from_buffer_copy", CDataType_from_buffer_copy, METH_VARARGS, from_buffer_copy_doc, }, - { "in_dll", CDataType_in_dll, METH_VARARGS, in_dll_doc }, + CTYPES__CDATA_FROM_BUFFER_METHODDEF + CTYPES__CDATA_FROM_BUFFER_COPY_METHODDEF + CTYPES__CDATA_IN_DLL_METHODDEF { NULL, NULL }, }; @@ -960,9 +1058,9 @@ PyCPointerType_from_param(PyObject *type static PyMethodDef PyCPointerType_methods[] = { { "from_address", CDataType_from_address, METH_O, from_address_doc }, - { "from_buffer", CDataType_from_buffer, METH_VARARGS, from_buffer_doc, }, - { "from_buffer_copy", CDataType_from_buffer_copy, METH_VARARGS, from_buffer_copy_doc, }, - { "in_dll", CDataType_in_dll, METH_VARARGS, in_dll_doc}, + CTYPES__CDATA_FROM_BUFFER_METHODDEF + CTYPES__CDATA_FROM_BUFFER_COPY_METHODDEF + CTYPES__CDATA_IN_DLL_METHODDEF { "from_param", (PyCFunction)PyCPointerType_from_param, METH_O, from_param_doc}, { "set_type", (PyCFunction)PyCPointerType_set_type, METH_O }, { NULL, NULL }, @@ -2048,9 +2146,9 @@ PyCSimpleType_from_param(PyObject *type, static PyMethodDef PyCSimpleType_methods[] = { { "from_param", PyCSimpleType_from_param, METH_O, from_param_doc }, { "from_address", CDataType_from_address, METH_O, from_address_doc }, - { "from_buffer", CDataType_from_buffer, METH_VARARGS, from_buffer_doc, }, - { "from_buffer_copy", CDataType_from_buffer_copy, METH_VARARGS, from_buffer_copy_doc, }, - { "in_dll", CDataType_in_dll, METH_VARARGS, in_dll_doc}, + CTYPES__CDATA_FROM_BUFFER_METHODDEF + CTYPES__CDATA_FROM_BUFFER_COPY_METHODDEF + CTYPES__CDATA_IN_DLL_METHODDEF { NULL, NULL }, };