[pypy-commit] pypy pyarg-parsetuple-s-star-buffer: fiddle around a bit - add a unit test that might exercise the desired functionality; play with Py_buffer definition and with the getargs.c implementation of s* for buffers. Broken.
exarkun
noreply at buildbot.pypy.org
Mon Dec 12 16:37:53 CET 2011
Author: Jean-Paul Calderone <exarkun at twistedmatrix.com>
Branch: pyarg-parsetuple-s-star-buffer
Changeset: r50429:0561684806ca
Date: 2011-12-12 10:37 -0500
http://bitbucket.org/pypy/pypy/changeset/0561684806ca/
Log: fiddle around a bit - add a unit test that might exercise the
desired functionality; play with Py_buffer definition and with the
getargs.c implementation of s* for buffers. Broken.
diff --git a/pypy/module/cpyext/__init__.py b/pypy/module/cpyext/__init__.py
--- a/pypy/module/cpyext/__init__.py
+++ b/pypy/module/cpyext/__init__.py
@@ -45,6 +45,7 @@
import pypy.module.cpyext.longobject
import pypy.module.cpyext.listobject
import pypy.module.cpyext.sequence
+import pypy.module.cpyext.buffer
import pypy.module.cpyext.eval
import pypy.module.cpyext.import_
import pypy.module.cpyext.mapping
diff --git a/pypy/module/cpyext/api.py b/pypy/module/cpyext/api.py
--- a/pypy/module/cpyext/api.py
+++ b/pypy/module/cpyext/api.py
@@ -1055,6 +1055,7 @@
boxed_args = ()
to_decref = []
assert len(args) == len(FT.ARGS)
+ import pdb; pdb.set_trace()
for i, ARG in unrolling_arg_types:
arg = args[i]
if is_PyObject(ARG):
diff --git a/pypy/module/cpyext/include/object.h b/pypy/module/cpyext/include/object.h
--- a/pypy/module/cpyext/include/object.h
+++ b/pypy/module/cpyext/include/object.h
@@ -234,7 +234,7 @@
writebufferproc bf_getwritebuffer;
segcountproc bf_getsegcount;
charbufferproc bf_getcharbuffer;
- getbufferproc bf_getbuffer;
+ getbufferproc bf_getbuffer;
releasebufferproc bf_releasebuffer;
} PyBufferProcs;
diff --git a/pypy/module/cpyext/src/getargs.c b/pypy/module/cpyext/src/getargs.c
--- a/pypy/module/cpyext/src/getargs.c
+++ b/pypy/module/cpyext/src/getargs.c
@@ -777,18 +777,14 @@
Py_buffer *p = (Py_buffer *)va_arg(*p_va, Py_buffer *);
if (PyString_Check(arg)) {
+ fflush(stdout);
PyBuffer_FillInfo(p, arg,
PyString_AS_STRING(arg), PyString_GET_SIZE(arg),
1, 0);
- } else {
- PyErr_SetString(
- PyExc_NotImplementedError,
- "s* not implemented for non-string values");
- return NULL;
- }
-#if 0
+ }
#ifdef Py_USING_UNICODE
else if (PyUnicode_Check(arg)) {
+#if 0
uarg = UNICODE_DEFAULT_ENCODING(arg);
if (uarg == NULL)
return converterr(CONV_UNICODE,
@@ -796,6 +792,9 @@
PyBuffer_FillInfo(p, arg,
PyString_AS_STRING(uarg), PyString_GET_SIZE(uarg),
1, 0);
+#else
+ return converterr("string or buffer", arg, msgbuf, bufsize);
+#endif
}
#endif
else { /* any buffer-like object */
@@ -803,7 +802,6 @@
if (getbuffer(arg, p, &buf) < 0)
return converterr(buf, arg, msgbuf, bufsize);
}
-#endif
if (addcleanup(p, freelist, cleanup_buffer)) {
return converterr(
"(cleanup problem)",
@@ -1342,7 +1340,6 @@
return count;
}
-#if 0 //YYY
static int
getbuffer(PyObject *arg, Py_buffer *view, char **errmsg)
{
@@ -1373,7 +1370,6 @@
PyBuffer_FillInfo(view, NULL, buf, count, 1, 0);
return 0;
}
-#endif
/* Support for keyword arguments donated by
Geoff Philbrick <philbric at delphi.hks.com> */
diff --git a/pypy/module/cpyext/stubs.py b/pypy/module/cpyext/stubs.py
--- a/pypy/module/cpyext/stubs.py
+++ b/pypy/module/cpyext/stubs.py
@@ -1,5 +1,5 @@
from pypy.module.cpyext.api import (
- cpython_api, PyObject, PyObjectP, CANNOT_FAIL
+ cpython_api, PyObject, PyObjectP, CANNOT_FAIL, Py_buffer
)
from pypy.module.cpyext.complexobject import Py_complex_ptr as Py_complex
from pypy.rpython.lltypesystem import rffi, lltype
@@ -10,7 +10,6 @@
PyMethodDef = rffi.VOIDP
PyGetSetDef = rffi.VOIDP
PyMemberDef = rffi.VOIDP
-Py_buffer = rffi.VOIDP
va_list = rffi.VOIDP
PyDateTime_Date = rffi.VOIDP
PyDateTime_DateTime = rffi.VOIDP
@@ -178,13 +177,6 @@
~Py_buffer.format."""
raise NotImplementedError
- at cpython_api([Py_buffer, lltype.Char], rffi.INT_real, error=CANNOT_FAIL)
-def PyBuffer_IsContiguous(space, view, fortran):
- """Return 1 if the memory defined by the view is C-style (fortran is
- 'C') or Fortran-style (fortran is 'F') contiguous or either one
- (fortran is 'A'). Return 0 otherwise."""
- raise NotImplementedError
-
@cpython_api([rffi.INT_real, Py_ssize_t, Py_ssize_t, Py_ssize_t, lltype.Char], lltype.Void)
def PyBuffer_FillContiguousStrides(space, ndim, shape, strides, itemsize, fortran):
"""Fill the strides array with byte-strides of a contiguous (C-style if
diff --git a/pypy/module/cpyext/test/test_getargs.py b/pypy/module/cpyext/test/test_getargs.py
--- a/pypy/module/cpyext/test/test_getargs.py
+++ b/pypy/module/cpyext/test/test_getargs.py
@@ -129,6 +129,23 @@
assert 'foo\0bar\0baz' == pybuffer('foo\0bar\0baz')
+ def test_pyarg_parse_string_old_buffer(self):
+ pybuffer = self.import_parser(
+ '''
+ Py_buffer buf;
+ PyObject *result;
+ if (!PyArg_ParseTuple(args, "s*", &buf)) {
+ return NULL;
+ }
+ printf("OH NO %s %d\\n", buf.buf, buf.len);
+ fflush(stdout);
+ result = PyString_FromStringAndSize(buf.buf, buf.len);
+ PyBuffer_Release(&buf);
+ return result;
+ ''')
+ assert buffer('foo\0bar\0baz') == pybuffer(buffer('foo\0bar\0baz'))
+
+
def test_pyarg_parse_charbuf_and_length(self):
"""
The `t#` format specifier can be used to parse a read-only 8-bit
More information about the pypy-commit
mailing list