On 04/06/2018 05:24 PM, Eric Blake wrote:
> PyObject_CallObject is powerful, but awkward - we have to wrap
> all arguments into a temporary tuple before using it.
> 
> Let python do more of the work by using PyObject_CallFunction
> anywhere that all arguments can be described by a Py_BuildValue()
> format string, instead of creating one-shot arguments ourselves.
> In fact, for our py_config(), this makes it easier to not worry
> about python 2 String vs. python 3 Unicode.
> 
> Similarly, PyObject_CallFunctionObjArgs is nicer when we
> already have PyObjects for all parameters (including in py_open(),
> where we can't use a Py_BuildValue() string for converting a
> C int into Py_True or Py_False, but can easily avoid the tuple
> wrapper).
> 

> @@ -436,20 +406,15 @@ py_pwrite (void *handle, const void *buf,
>  {
>    PyObject *obj = handle;
>    PyObject *fn;
> -  PyObject *args;
>    PyObject *r;
> 
>    if (callback_defined ("pwrite", &fn)) {
>      PyErr_Clear ();
> 
> -    args = PyTuple_New (3);
> -    Py_INCREF (obj); /* decremented by Py_DECREF (args) */
> -    PyTuple_SetItem (args, 0, obj);
> -    PyTuple_SetItem (args, 1, PyByteArray_FromStringAndSize (buf, count));
> -    PyTuple_SetItem (args, 2, PyLong_FromUnsignedLongLong (offset));
> -    r = PyObject_CallObject (fn, args);
> +    r = PyObject_CallFunction (fn, "OOL", obj,
> +                               PyByteArray_FromStringAndSize (buf, count),
> +                               offset, NULL);

This leaks the PyByteArray object.  Will fix.

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

Attachment: signature.asc
Description: OpenPGP digital signature

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

Reply via email to