On Thu, Dec 11, 2014 at 11:29:48AM +0000, Richard W.M. Jones wrote:
This returns the raw C pointer to the underlying object, eg:
conn = libvirt.open(None)
print "0x%x" % conn.c_pointer() # returns virConnectPtr of the connection
dom = conn.lookupByName("test")
print "0x%x" % dom.c_pointer() # returns virDomainPtr of the domain
The reason behind this is to allow us to transparently pass Python dom
objects through the libguestfs Python API.
Yep, that makes sense, since the alternative is the poke around in
private attributes.
https://bugzilla.redhat.com/show_bug.cgi?id=1075164
---
generator.py | 32 ++++++++++++++++++++++++++++++++
sanitytest.py | 2 ++
2 files changed, 34 insertions(+)
diff --git a/generator.py b/generator.py
index 20df54f..cf044c9 100755
--- a/generator.py
+++ b/generator.py
@@ -821,6 +821,27 @@ def print_function_wrapper(module, name, output, export, include):
return 0
return 1
+def print_c_pointer(classname, output, export, include):
+ output.write("PyObject *\n")
+ output.write("libvirt_%s_pointer(PyObject *self ATTRIBUTE_UNUSED, PyObject
*args)\n" % classname)
+ output.write("{\n")
+ output.write(" %sPtr ptr;\n" % classname)
+ output.write(" PyObject *pyptr;\n")
+ output.write(" PyObject *pylong;\n")
+ output.write("\n")
+ output.write(" if (!PyArg_ParseTuple(args, (char *) \"O\",
&pyptr))\n")
+ output.write(" return NULL;\n")
+ output.write(" ptr = (%sPtr) Py%s_Get(pyptr);\n" % (classname,
classname))
+ output.write(" pylong = PyLong_FromVoidPtr(ptr);\n")
+ output.write(" return pylong;\n")
+ output.write("}\n")
+ output.write("\n")
+
+ include.write("PyObject *libvirt_%s_pointer(PyObject *self, PyObject
*args);\n" % classname)
+
+ export.write(" { (char *)\"%s_pointer\", libvirt_%s_pointer,
METH_VARARGS, NULL },\n" %
+ (classname, classname))
+
def buildStubs(module, api_xml):
global py_types
global py_return_types
@@ -917,6 +938,12 @@ def buildStubs(module, api_xml):
del funcs[function]
if ret == 1:
nb_wrap = nb_wrap + 1
+
+ if module == "libvirt":
+ # Write C pointer conversion functions.
+ for classname in primary_classes:
+ print_c_pointer(classname, wrapper, export, include)
+
include.close()
export.close()
wrapper.close()
@@ -1496,6 +1523,11 @@ def buildWrappers(module):
classes.write(" def domain(self):\n")
classes.write(" return self._dom\n\n")
+ classes.write(" def c_pointer(self):\n")
+ classes.write(" \"\"\"Get C pointer to underlying
object\"\"\"\n")
+ classes.write(" return libvirtmod.%s_pointer(self._o)\n\n"
%
+ classname)
+
flist = function_classes[classname]
flist.sort(key=functionSortKey)
oldfile = ""
diff --git a/sanitytest.py b/sanitytest.py
index f5337fc..9907f3d 100644
--- a/sanitytest.py
+++ b/sanitytest.py
@@ -109,6 +109,8 @@ for klassname in gottypes:
for name in dir(klassobj):
if name[0] == '_':
continue
+ if name == 'c_pointer':
+ continue
thing = getattr(klassobj, name)
if callable(thing):
gotfunctions[klassname].append(name)