[Python-checkins] r64070 - python/trunk/Modules/_ctypes/callproc.c

thomas.heller python-checkins at python.org
Tue Jun 10 16:02:46 CEST 2008


Author: thomas.heller
Date: Tue Jun 10 16:02:46 2008
New Revision: 64070

Log:
Add an optional 'offset' parameter to byref, defaultingto zero.


Modified:
   python/trunk/Modules/_ctypes/callproc.c

Modified: python/trunk/Modules/_ctypes/callproc.c
==============================================================================
--- python/trunk/Modules/_ctypes/callproc.c	(original)
+++ python/trunk/Modules/_ctypes/callproc.c	Tue Jun 10 16:02:46 2008
@@ -1561,7 +1561,7 @@
 }
 
 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 @@
  * 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 @@
 	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 @@
 #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 },


More information about the Python-checkins mailing list