[Libguestfs] [PATCH libnbd] generator: Add Mutable type to the generator.

Eric Blake eblake at redhat.com
Tue Jun 25 22:42:01 UTC 2019


On 6/25/19 3:47 PM, Eric Blake wrote:
> On 6/25/19 12:11 PM, Richard W.M. Jones wrote:
>> Mutable (Int n) => int *n
>>
>> This can currently only be used for callback arguments of type int
>> (not for other types, nor for any ordinary function arguments), but it
>> could be implemented more generally in future.
>> ---
>>  generator/generator | 75 +++++++++++++++++++++++++++++++++++++--------
>>  1 file changed, 63 insertions(+), 12 deletions(-)
>>
> 
>> @@ -3261,14 +3265,20 @@ let print_python_binding name { args; ret } =
>>              pr "  for (size_t i = 0; i < %s; ++i)\n" len;
>>              pr "    PyList_SET_ITEM (py_%s, i, PyLong_FromUnsignedLong (%s[i]));\n" n n
>>           | BytesIn _ -> ()
>> +         | Mutable (Int n) ->
>> +            pr "  PyObject *py_%s_dict = PyImport_GetModuleDict ();\n" n;
>> +            pr "  PyObject *py_%s_mod = PyMapping_GetItemString (py_%s_dict, \"ctypes\");\n" n n;
>> +            pr "  PyObject *py_%s = PyObject_CallMethod (py_%s_mod, \"c_int\", \"i\", *%s);\n" n n n
> 
> PyMapping_GetItemString() is returning NULL, then the program is
> segfaulting on PyObject_CallMethod. This code needs some error checking
> to be safe, as well as a tweak to more properly call into Python (did we
> forget an earlier global import of the ctypes module?).
> 

Here's what I squashed in to make it work in Python 3 (if we want to
support Python 2, we also need a configure check for
PyString_From_String and use that instead - but I'm of the opinion that
python 2 is close enough to death that libnbd need not worry about it,
even if nbdkit still supports it).

diff --git i/generator/generator w/generator/generator
index fadbdfc..b5c4e9a 100755
--- i/generator/generator
+++ w/generator/generator
@@ -3380,9 +3380,13 @@ let print_python_binding name { args; ret } =
          | BytesIn _
          | Int _ -> ()
          | Mutable (Int n) ->
-            pr "  PyObject *py_%s_dict = PyImport_GetModuleDict ();\n" n;
-            pr "  PyObject *py_%s_mod = PyMapping_GetItemString
(py_%s_dict, \"ctypes\");\n" n n;
-            pr "  PyObject *py_%s = PyObject_CallMethod (py_%s_mod,
\"c_int\", \"i\", *%s);\n" n n n
+            pr "  PyObject *py_%s_modname = PyUnicode_FromString
(\"ctypes\");\n" n;
+            pr "  if (!py_%s_modname) { PyErr_PrintEx (0); return -1;
}\n" n;
+            pr "  PyObject *py_%s_mod = PyImport_Import
(py_%s_modname);\n" n n;
+            pr "  Py_DECREF (py_%s_modname);\n" n;
+            pr "  if (!py_%s_mod) { PyErr_PrintEx (0); return -1; }\n" n;
+            pr "  PyObject *py_%s = PyObject_CallMethod (py_%s_mod,
\"c_int\", \"i\", *%s);\n" n n n;
+            pr "  if (!py_%s) { PyErr_PrintEx (0); return -1; }\n" n;
          | Opaque n ->
             pr "  struct %s_%s_data *_data = %s;\n" name cb_name n
          | String n
@@ -3460,7 +3464,7 @@ let print_python_binding name { args; ret } =
          | ArrayAndLen (UInt32 n, _) ->
             pr "  Py_DECREF (py_%s);\n" n
          | Mutable (Int n) ->
-            pr "  PyObject *py_%s_ret = PyObject_CallMethod (py_%s,
\"value\", \"\");\n" n n;
+            pr "  PyObject *py_%s_ret = PyObject_GetAttrString (py_%s,
\"value\");\n" n n;
             pr "  *%s = PyLong_AsLong (py_%s_ret);\n" n n;
             pr "  Py_DECREF (py_%s_ret);\n" n;
             pr "  Py_DECREF (py_%s);\n" n


-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libguestfs/attachments/20190625/1dd82a69/attachment.sig>


More information about the Libguestfs mailing list