44
44
static char *convertsimple(PyObject *, const char **, va_list *, int, char *,
45
45
size_t, PyObject **);
46
46
static Py_ssize_t convertbuffer(PyObject *, void **p, char **);
47
static int getbuffer(PyObject *, Py_buffer *, char**);
48
49
static int vgetargskeywords(PyObject *, PyObject *,
49
50
const char *, char **, va_list *, int);
139
140
/* Handle cleanup of allocated memory in case of exception */
143
cleanup_ptr(void *ptr)
149
cleanup_buffer(void *ptr)
151
PyBuffer_Release((Py_buffer *) ptr);
142
addcleanup(void *ptr, PyObject **freelist)
155
addcleanup(void *ptr, PyObject **freelist, void (*destr)(void *))
145
158
if (!*freelist) {
146
159
*freelist = PyList_New(0);
147
160
if (!*freelist) {
152
cobj = PyCObject_FromVoidPtr(ptr, NULL);
165
cobj = PyCObject_FromVoidPtr(ptr, destr);
157
170
if (PyList_Append(*freelist, cobj)) {
167
179
cleanreturn(int retval, PyObject *freelist)
171
Py_ssize_t len = PyList_GET_SIZE(freelist), i;
172
for (i = 0; i < len; i++)
173
PyMem_FREE(PyCObject_AsVoidPtr(
174
PyList_GET_ITEM(freelist, i)));
181
if (freelist && retval != 0) {
182
/* We were successful, reset the destructors so that they
184
Py_ssize_t len = PyList_GET_SIZE(freelist), i;
185
for (i = 0; i < len; i++)
186
((PyCObject *) PyList_GET_ITEM(freelist, i))
189
Py_XDECREF(freelist);
775
787
case 's': {/* string */
776
if (*format == '#') {
788
if (*format == '*') {
789
Py_buffer *p = (Py_buffer *)va_arg(*p_va, Py_buffer *);
791
if (PyString_Check(arg)) {
792
PyBuffer_FillInfo(p, arg,
793
PyString_AS_STRING(arg), PyString_GET_SIZE(arg),
796
#ifdef Py_USING_UNICODE
797
else if (PyUnicode_Check(arg)) {
798
uarg = UNICODE_DEFAULT_ENCODING(arg);
800
return converterr(CONV_UNICODE,
801
arg, msgbuf, bufsize);
802
PyBuffer_FillInfo(p, arg,
803
PyString_AS_STRING(uarg), PyString_GET_SIZE(uarg),
807
else { /* any buffer-like object */
809
if (getbuffer(arg, p, &buf) < 0)
810
return converterr(buf, arg, msgbuf, bufsize);
812
if (addcleanup(p, freelist, cleanup_buffer)) {
815
arg, msgbuf, bufsize);
818
} else if (*format == '#') {
777
819
void **p = (void **)va_arg(*p_va, char **);
825
867
case 'z': {/* string, may be NULL (None) */
826
if (*format == '#') { /* any buffer-like object */
868
if (*format == '*') {
869
Py_buffer *p = (Py_buffer *)va_arg(*p_va, Py_buffer *);
872
PyBuffer_FillInfo(p, NULL, NULL, 0, 1, 0);
873
else if (PyString_Check(arg)) {
874
PyBuffer_FillInfo(p, arg,
875
PyString_AS_STRING(arg), PyString_GET_SIZE(arg),
878
#ifdef Py_USING_UNICODE
879
else if (PyUnicode_Check(arg)) {
880
uarg = UNICODE_DEFAULT_ENCODING(arg);
882
return converterr(CONV_UNICODE,
883
arg, msgbuf, bufsize);
884
PyBuffer_FillInfo(p, arg,
885
PyString_AS_STRING(uarg), PyString_GET_SIZE(uarg),
889
else { /* any buffer-like object */
891
if (getbuffer(arg, p, &buf) < 0)
892
return converterr(buf, arg, msgbuf, bufsize);
894
if (addcleanup(p, freelist, cleanup_buffer)) {
897
arg, msgbuf, bufsize);
900
} else if (*format == '#') { /* any buffer-like object */
827
901
void **p = (void **)va_arg(*p_va, char **);
1043
1117
return converterr("(memory error)",
1044
1118
arg, msgbuf, bufsize);
1046
if (addcleanup(*buffer, freelist)) {
1120
if (addcleanup(*buffer, freelist, cleanup_ptr)) {
1048
1122
return converterr("(cleanup problem)",
1049
1123
arg, msgbuf, bufsize);
1145
1219
case 'w': { /* memory buffer, read-write access */
1146
1220
void **p = va_arg(*p_va, void **);
1147
1222
PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
1148
1223
Py_ssize_t count;
1225
if (pb && pb->bf_releasebuffer && *format != '*')
1226
/* Buffer must be released, yet caller does not use
1227
the Py_buffer protocol. */
1228
return converterr("pinned buffer", arg, msgbuf, bufsize);
1230
if (pb && pb->bf_getbuffer && *format == '*') {
1231
/* Caller is interested in Py_buffer, and the object
1232
supports it directly. */
1234
if (pb->bf_getbuffer(arg, (Py_buffer*)p, PyBUF_WRITABLE) < 0) {
1236
return converterr("read-write buffer", arg, msgbuf, bufsize);
1238
if (addcleanup(p, freelist, cleanup_buffer)) {
1240
"(cleanup problem)",
1241
arg, msgbuf, bufsize);
1243
if (!PyBuffer_IsContiguous((Py_buffer*)p, 'C'))
1244
return converterr("contiguous buffer", arg, msgbuf, bufsize);
1151
1249
pb->bf_getwritebuffer == NULL ||
1152
1250
pb->bf_getsegcount == NULL)
1153
1251
return converterr("read-write buffer", arg, msgbuf, bufsize);
1154
1252
if ((*pb->bf_getsegcount)(arg, NULL) != 1)
1155
1253
return converterr("single-segment read-write buffer",
1156
1254
arg, msgbuf, bufsize);
1157
if ((count = pb->bf_getwritebuffer(arg, 0, p)) < 0)
1255
if ((count = pb->bf_getwritebuffer(arg, 0, &res)) < 0)
1158
1256
return converterr("(unspecified)", arg, msgbuf, bufsize);
1159
if (*format == '#') {
1257
if (*format == '*') {
1258
PyBuffer_FillInfo((Py_buffer*)p, arg, res, count, 1, 0);
1263
if (*format == '#') {
1186
1291
"string or single-segment read-only buffer",
1187
1292
arg, msgbuf, bufsize);
1294
if (pb->bf_releasebuffer)
1296
"string or pinned buffer",
1297
arg, msgbuf, bufsize);
1189
1299
count = pb->bf_getcharbuffer(arg, 0, p);
1191
1301
return converterr("(unspecified)", arg, msgbuf, bufsize);
1212
1322
Py_ssize_t count;
1213
1323
if (pb == NULL ||
1214
1324
pb->bf_getreadbuffer == NULL ||
1215
pb->bf_getsegcount == NULL) {
1325
pb->bf_getsegcount == NULL ||
1326
pb->bf_releasebuffer != NULL) {
1216
1327
*errmsg = "string or read-only buffer";
1341
getbuffer(PyObject *arg, Py_buffer *view, char **errmsg)
1345
PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
1347
*errmsg = "string or buffer";
1350
if (pb->bf_getbuffer) {
1351
if (pb->bf_getbuffer(arg, view, 0) < 0) {
1352
*errmsg = "convertible to a buffer";
1355
if (!PyBuffer_IsContiguous(view, 'C')) {
1356
*errmsg = "contiguous buffer";
1362
count = convertbuffer(arg, &buf, errmsg);
1364
*errmsg = "convertible to a buffer";
1367
PyBuffer_FillInfo(view, NULL, buf, count, 1, 0);
1229
1371
/* Support for keyword arguments donated by
1230
1372
Geoff Philbrick <philbric@delphi.hks.com> */