Author: Jean-Paul Calderone <[email protected]>
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 <[email protected]> */
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
 
-@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
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to