On Wed, Aug 02, 2023 at 08:50:24PM -0500, Eric Blake wrote: > 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 > --
Reviewed-by: Richard W.M. Jones <rjo...@redhat.com> -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com virt-top is 'top' for virtual machines. Tiny program with many powerful monitoring features, net stats, disk stats, logging, etc. http://people.redhat.com/~rjones/virt-top _______________________________________________ Libguestfs mailing list Libguestfs@redhat.com https://listman.redhat.com/mailman/listinfo/libguestfs