@@@ py_buffer/freebin wip
[catacomb-python] / pyke / pyke.c
index 330f15c..4233c2f 100644 (file)
@@ -106,8 +106,10 @@ end:
 int convbin(PyObject *o, void *pp)
 {
   struct bin *r = pp;
+  int rc;
 
   if (BIN_CHECK(o)) {
+    r->vw.obj = 0;
     r->p = BIN_PTR(o);
     r->sz = BIN_LEN(o);
     return (1);
@@ -116,14 +118,25 @@ int convbin(PyObject *o, void *pp)
   if (PyUnicode_Check(o)) {
     o = _PyUnicode_AsDefaultEncodedString(o, 0);
     if (!o) return (0);
+    r->vw.obj = 0;
     r->p = PyString_AS_STRING(o);
     r->sz = PyString_GET_SIZE(o);
     return (1);
   }
 #endif
+#if PY_VERSION_HEX < 0x02060000
+  r->vw.buf = 0;
   return (PyObject_AsReadBuffer(o, &r->p, &r->sz) ? 0 : 1);
+#else
+  rc = PyObject_GetBuffer(o, &r->vw, PyBUF_SIMPLE); if (rc) return (0);
+  o->p = o->vw.buf; o->sz = o->vw.len;
+  return (1);
+#endif
 }
 
+void freebin(struct bin *r)
+  { if (r->vw.obj) PyBuffer_Release(&r->vw); }
+
 /*----- Miscellaneous utilities -------------------------------------------*/
 
 PyObject *abstract_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw)