See the earlier commit "Add Extent64 arg type" for rationale in
supporting a new generator arg type.  This patch adds the Python
bindings for use of Extent64: it is fairly easy to construct a list of
2-item tuples in place with Py_BuildValue's 'K' argument for unsigned
64-bit values, without needing to write any separate helper code.

Signed-off-by: Eric Blake <ebl...@redhat.com>
---

v4: split out of larger patch [Laszlo], use K instead of O to avoid
memory issues while building list
---
 generator/Python.ml | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/generator/Python.ml b/generator/Python.ml
index 3a77b81f..761f4511 100644
--- a/generator/Python.ml
+++ b/generator/Python.ml
@@ -169,7 +169,7 @@ let
   pr "  PyObject *py_args, *py_ret;\n";
   List.iter (
     function
-    | CBArrayAndLen (UInt32 n, _)
+    | CBArrayAndLen ((UInt32 n | Extent64 n), _)
     | CBBytesIn (n, _)
     | CBMutable (Int n) ->
        pr "  PyObject *py_%s = NULL;\n" n
@@ -187,6 +187,18 @@ let
        pr "    if (!py_e_%s) { PyErr_PrintEx (0); goto out; }\n" n;
        pr "    PyList_SET_ITEM (py_%s, i_%s, py_e_%s);\n" n n n;
        pr "  }\n"
+    | CBArrayAndLen (Extent64 n, len) ->
+       pr "  py_%s = PyList_New (%s);\n" n len;
+       pr "  if (!py_%s) { PyErr_PrintEx (0); goto out; }\n" n;
+       pr "  size_t i_%s;\n" n;
+       pr "  for (i_%s = 0; i_%s < %s; ++i_%s) {\n" n n len n;
+       pr "    PyObject *py_e_%s = Py_BuildValue (" n;
+       pr_wrap ',' (fun () ->
+           pr "\"KK\", %s[i_%s].length, %s[i_%s].flags" n n n n);
+       pr ");\n";
+       pr "    if (!py_e_%s) { PyErr_PrintEx (0); goto out; }\n" n;
+       pr "    PyList_SET_ITEM (py_%s, i_%s, py_e_%s);\n" n n n;
+       pr "  }\n"
     | CBBytesIn (n, len) ->
        pr "  py_%s = nbd_internal_py_get_subview (data->view, %s, %s);\n" n n 
len;
        pr "  if (!py_%s) { PyErr_PrintEx (0); goto out; }\n" n
@@ -205,7 +217,7 @@ let
   let params =
     List.map (
       function
-      | CBArrayAndLen (UInt32 n, _) -> "O", sprintf "py_%s" n
+      | CBArrayAndLen ((UInt32 n | Extent64 n), _) -> "O", sprintf "py_%s" n
       | CBBytesIn (n, _) -> "O", sprintf "py_%s" n
       | CBInt n -> "i", n
       | CBInt64 n -> "L", n
@@ -254,7 +266,7 @@ let
   pr " out:\n";
   List.iter (
     function
-    | CBArrayAndLen (UInt32 n, _) ->
+    | CBArrayAndLen ((UInt32 n | Extent64 n), _) ->
        pr "  Py_XDECREF (py_%s);\n" n
     | CBBytesIn (n, _) ->
        pr "  Py_XDECREF (py_%s);\n" n
-- 
2.41.0

_______________________________________________
Libguestfs mailing list
Libguestfs@redhat.com
https://listman.redhat.com/mailman/listinfo/libguestfs

Reply via email to