Skip to content
This repository was archived by the owner on Aug 2, 2019. It is now read-only.

Commit 8f9e723

Browse files
committed
Merge the first pyarg branch
2 parents bfa0dac + 976bf5b commit 8f9e723

File tree

7 files changed

+325
-80
lines changed

7 files changed

+325
-80
lines changed

.hgsubstate

Whitespace-only changes.

pypy/module/cpyext/api.py

+17
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,23 @@ def get_structtype_for_ctype(ctype):
411411
PyVarObjectStruct = cpython_struct("PyVarObject", PyVarObjectFields)
412412
PyVarObject = lltype.Ptr(PyVarObjectStruct)
413413

414+
Py_buffer = cpython_struct(
415+
"Py_buffer", (
416+
('buf', rffi.VOIDP),
417+
('obj', PyObject),
418+
('len', Py_ssize_t),
419+
# ('itemsize', Py_ssize_t),
420+
421+
# ('readonly', lltype.Signed),
422+
# ('ndim', lltype.Signed),
423+
# ('format', rffi.CCHARP),
424+
# ('shape', Py_ssize_tP),
425+
# ('strides', Py_ssize_tP),
426+
# ('suboffets', Py_ssize_tP),
427+
# ('smalltable', rffi.CFixedArray(Py_ssize_t, 2)),
428+
# ('internal', rffi.VOIDP)
429+
))
430+
414431
@specialize.memo()
415432
def is_PyObject(TYPE):
416433
if not isinstance(TYPE, lltype.Ptr):

pypy/module/cpyext/include/object.h

+23-3
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@ we have it for compatibility with CPython.
1616
*/
1717
#define staticforward static
1818

19-
typedef void* Py_buffer;
20-
21-
2219
#define PyObject_HEAD \
2320
long ob_refcnt; \
2421
struct _typeobject *ob_type;
@@ -130,6 +127,29 @@ typedef int (*objobjproc)(PyObject *, PyObject *);
130127
typedef int (*visitproc)(PyObject *, void *);
131128
typedef int (*traverseproc)(PyObject *, visitproc, void *);
132129

130+
/* Py3k buffer interface */
131+
typedef struct bufferinfo {
132+
void *buf;
133+
PyObject *obj; /* owned reference */
134+
Py_ssize_t len;
135+
136+
/* This is Py_ssize_t so it can be
137+
pointed to by strides in simple case.*/
138+
/* Py_ssize_t itemsize; */
139+
/* int readonly; */
140+
/* int ndim; */
141+
/* char *format; */
142+
/* Py_ssize_t *shape; */
143+
/* Py_ssize_t *strides; */
144+
/* Py_ssize_t *suboffsets; */
145+
146+
/* static store for shape and strides of
147+
mono-dimensional buffers. */
148+
/* Py_ssize_t smalltable[2]; */
149+
/* void *internal; */
150+
} Py_buffer;
151+
152+
133153
typedef int (*getbufferproc)(PyObject *, Py_buffer *, int);
134154
typedef void (*releasebufferproc)(PyObject *, Py_buffer *);
135155

pypy/module/cpyext/object.py

+16-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
from pypy.rpython.lltypesystem import rffi, lltype
22
from pypy.module.cpyext.api import (
33
cpython_api, generic_cpy_call, CANNOT_FAIL, Py_ssize_t, Py_ssize_tP,
4-
PyVarObject, Py_TPFLAGS_HEAPTYPE, Py_LT, Py_LE, Py_EQ, Py_NE, Py_GT,
4+
PyVarObject, Py_buffer,
5+
Py_TPFLAGS_HEAPTYPE, Py_LT, Py_LE, Py_EQ, Py_NE, Py_GT,
56
Py_GE, CONST_STRING, FILEP, fwrite)
67
from pypy.module.cpyext.pyobject import (
78
PyObject, PyObjectP, create_ref, from_ref, Py_IncRef, Py_DecRef,
@@ -428,3 +429,17 @@ def PyObject_Print(space, w_obj, fp, flags):
428429
rffi.free_nonmovingbuffer(data, buf)
429430
return 0
430431

432+
433+
@cpython_api([lltype.Ptr(Py_buffer), PyObject, rffi.VOIDP, Py_ssize_t,
434+
lltype.Signed, lltype.Signed], rffi.INT, error=CANNOT_FAIL)
435+
def PyBuffer_FillInfo(space, view, obj, buf, length, readonly, flags):
436+
view.c_buf = buf
437+
view.c_len = length
438+
view.c_obj = obj
439+
Py_IncRef(space, obj)
440+
return 0
441+
442+
443+
@cpython_api([lltype.Ptr(Py_buffer)], lltype.Void, error=CANNOT_FAIL)
444+
def PyBuffer_Release(space, view):
445+
pass

pypy/module/cpyext/src/getargs.c

+29-16
Original file line numberDiff line numberDiff line change
@@ -135,13 +135,11 @@ cleanup_ptr(void *ptr)
135135
PyMem_FREE(ptr);
136136
}
137137

138-
#if 0
139138
static void
140139
cleanup_buffer(void *ptr)
141140
{
142141
PyBuffer_Release((Py_buffer *) ptr);
143142
}
144-
#endif
145143

146144
static int
147145
addcleanup(void *ptr, PyObject **freelist, void (*destr)(void *))
@@ -776,15 +774,19 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
776774
}
777775
case 's': {/* string */
778776
if (*format == '*') {
779-
Py_FatalError("* format unsupported for strings in PyArg_*\n");
780-
#if 0
781777
Py_buffer *p = (Py_buffer *)va_arg(*p_va, Py_buffer *);
782778

783779
if (PyString_Check(arg)) {
784780
PyBuffer_FillInfo(p, arg,
785781
PyString_AS_STRING(arg), PyString_GET_SIZE(arg),
786782
1, 0);
787-
}
783+
} else {
784+
PyErr_SetString(
785+
PyExc_NotImplementedError,
786+
"s* not implemented for non-string values");
787+
return NULL;
788+
}
789+
#if 0
788790
#ifdef Py_USING_UNICODE
789791
else if (PyUnicode_Check(arg)) {
790792
uarg = UNICODE_DEFAULT_ENCODING(arg);
@@ -801,13 +803,13 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
801803
if (getbuffer(arg, p, &buf) < 0)
802804
return converterr(buf, arg, msgbuf, bufsize);
803805
}
806+
#endif
804807
if (addcleanup(p, freelist, cleanup_buffer)) {
805808
return converterr(
806809
"(cleanup problem)",
807810
arg, msgbuf, bufsize);
808811
}
809812
format++;
810-
#endif
811813
} else if (*format == '#') {
812814
void **p = (void **)va_arg(*p_va, char **);
813815
FETCH_SIZE;
@@ -1266,24 +1268,28 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
12661268
}
12671269

12681270
case 't': { /* 8-bit character buffer, read-only access */
1269-
Py_FatalError("'t' unsupported");
1270-
#if 0
12711271
char **p = va_arg(*p_va, char **);
12721272
PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
12731273
Py_ssize_t count;
1274-
1274+
printf("this far\n");
1275+
1276+
#if 0
12751277
if (*format++ != '#')
12761278
return converterr(
12771279
"invalid use of 't' format character",
12781280
arg, msgbuf, bufsize);
1281+
#endif
12791282
if (!PyType_HasFeature(arg->ob_type,
1280-
Py_TPFLAGS_HAVE_GETCHARBUFFER) ||
1281-
pb == NULL || pb->bf_getcharbuffer == NULL ||
1282-
pb->bf_getsegcount == NULL)
1283+
Py_TPFLAGS_HAVE_GETCHARBUFFER)
1284+
#if 0
1285+
|| pb == NULL || pb->bf_getcharbuffer == NULL ||
1286+
pb->bf_getsegcount == NULL
1287+
#endif
1288+
)
12831289
return converterr(
12841290
"string or read-only character buffer",
12851291
arg, msgbuf, bufsize);
1286-
1292+
#if 0
12871293
if (pb->bf_getsegcount(arg, NULL) != 1)
12881294
return converterr(
12891295
"string or single-segment read-only buffer",
@@ -1293,16 +1299,23 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
12931299
return converterr(
12941300
"string or pinned buffer",
12951301
arg, msgbuf, bufsize);
1296-
1302+
#endif
1303+
printf("this far!\n");
1304+
printf("%p\n", pb->bf_getcharbuffer);
12971305
count = pb->bf_getcharbuffer(arg, 0, p);
1306+
printf("after\n");
1307+
#if 0
12981308
if (count < 0)
12991309
return converterr("(unspecified)", arg, msgbuf, bufsize);
1310+
#endif
13001311
{
1312+
printf("fetch size\n");
13011313
FETCH_SIZE;
1314+
printf("did that\n");
13021315
STORE_SIZE(count);
1316+
printf("store size done\n");
13031317
}
13041318
break;
1305-
#endif
13061319
}
13071320
default:
13081321
return converterr("impossible<bad format char>", arg, msgbuf, bufsize);
@@ -1616,7 +1629,7 @@ vgetargskeywords(PyObject *args, PyObject *keywords, const char *format,
16161629
int match = 0;
16171630
char *ks;
16181631
if (!PyString_Check(key)) {
1619-
PyErr_SetString(PyExc_TypeError,
1632+
PyErr_SetString(PyExc_TypeError,
16201633
"keywords must be strings");
16211634
return cleanreturn(0, freelist);
16221635
}

0 commit comments

Comments
 (0)