summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorThomas Heller <theller@ctypes.org>2008-06-10 14:02:46 (GMT)
committerThomas Heller <theller@ctypes.org>2008-06-10 14:02:46 (GMT)
commitdcea9a91c6235948976fc40979fdc57e74266d3b (patch)
tree5a8974d84d6a2d48c878319b42e3cd61dd462047 /Modules
parent60977c73c5f82cb1b4b857aec572e4767b1f91e4 (diff)
downloadcpython-dcea9a91c6235948976fc40979fdc57e74266d3b.zip
cpython-dcea9a91c6235948976fc40979fdc57e74266d3b.tar.gz
cpython-dcea9a91c6235948976fc40979fdc57e74266d3b.tar.bz2
Add an optional 'offset' parameter to byref, defaultingto zero.
Diffstat (limited to 'Modules')
-rw-r--r--Modules/_ctypes/callproc.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c
index 825a2c7..d2727e4 100644
--- a/Modules/_ctypes/callproc.c
+++ b/Modules/_ctypes/callproc.c
@@ -1561,7 +1561,7 @@ align_func(PyObject *self, PyObject *obj)
}
static char byref_doc[] =
-"byref(C instance) -> byref-object\n"
+"byref(C instance[, offset=0]) -> byref-object\n"
"Return a pointer lookalike to a C instance, only usable\n"
"as function argument";
@@ -1570,9 +1570,21 @@ static char byref_doc[] =
* but still has a reference to self.
*/
static PyObject *
-byref(PyObject *self, PyObject *obj)
+byref(PyObject *self, PyObject *args)
{
PyCArgObject *parg;
+ PyObject *obj;
+ PyObject *pyoffset = NULL;
+ Py_ssize_t offset = 0;
+
+ if (!PyArg_UnpackTuple(args, "byref", 1, 2,
+ &obj, &pyoffset))
+ return NULL;
+ if (pyoffset) {
+ offset = PyNumber_AsSsize_t(pyoffset, NULL);
+ if (offset == -1 && PyErr_Occurred())
+ return NULL;
+ }
if (!CDataObject_Check(obj)) {
PyErr_Format(PyExc_TypeError,
"byref() argument must be a ctypes instance, not '%s'",
@@ -1588,7 +1600,7 @@ byref(PyObject *self, PyObject *obj)
parg->pffi_type = &ffi_type_pointer;
Py_INCREF(obj);
parg->obj = obj;
- parg->value.p = ((CDataObject *)obj)->b_ptr;
+ parg->value.p = (char *)((CDataObject *)obj)->b_ptr + offset;
return (PyObject *)parg;
}
@@ -1876,7 +1888,7 @@ PyMethodDef module_methods[] = {
#endif
{"alignment", align_func, METH_O, alignment_doc},
{"sizeof", sizeof_func, METH_O, sizeof_doc},
- {"byref", byref, METH_O, byref_doc},
+ {"byref", byref, METH_VARARGS, byref_doc},
{"addressof", addressof, METH_O, addressof_doc},
{"call_function", call_function, METH_VARARGS },
{"call_cdeclfunction", call_cdeclfunction, METH_VARARGS },