mirror of
https://gitlab.com/libvirt/libvirt-python.git
synced 2025-12-06 00:23:47 +03:00
python: fix bindings that don't raise an exception
For example:
>>> dom.memoryStats()
libvir: QEMU Driver error : Requested operation is not valid:\
domain is not running
There are six such python API functions like so.
The root reason is that generator.py script checks the type of return
value of a python stub function defined in libvirt-api.xml or
libvirt-override-api.xml to see whether to add the raise clause or not
in python wrapper code in libvirt.py.
The type of return value is supposed to be C types.
For those stub functions which return python non-integer data type like
string, list, tuple, dictionary, the existing type in functions varies
from each other which leads problem like this.
Currently, in generator.py, it maintains a buggy whitelist for stub functions
returning a list type. I think it is easy to forget adding new function name
in the whitelist.
This patch makes the value of type consistent with C type "char *"
in libvirt-override-api.xml. For python, any of types could be printed
as string, so I choose "char *" in this case. And the comment in xml
could explain it when adding new function definition.
<function name='virNodeGetCPUStats' file='python'>
...
- <return type='virNodeCPUStats' info='...'/>
+ <return type='char *' info='...'/>
...
</function>
This commit is contained in:
10
generator.py
10
generator.py
@@ -1009,11 +1009,9 @@ functions_list_exception_test = {
|
||||
}
|
||||
functions_list_default_test = "%s is None"
|
||||
|
||||
def is_list_type (name):
|
||||
whitelist = [ "virDomainBlockStats",
|
||||
"virDomainInterfaceStats" ]
|
||||
def is_python_noninteger_type (name):
|
||||
|
||||
return name[-1:] == "*" or name in whitelist
|
||||
return name[-1:] == "*"
|
||||
|
||||
def nameFixup(name, classe, type, file):
|
||||
# avoid a desastrous clash
|
||||
@@ -1387,7 +1385,7 @@ def buildWrappers(module):
|
||||
("ret", name))
|
||||
classes.write(" return ret\n")
|
||||
|
||||
elif is_list_type (ret[0]):
|
||||
elif is_python_noninteger_type (ret[0]):
|
||||
if not functions_noexcept.has_key (name):
|
||||
if functions_list_exception_test.has_key (name):
|
||||
test = functions_list_exception_test[name]
|
||||
@@ -1657,7 +1655,7 @@ def buildWrappers(module):
|
||||
|
||||
classes.write (" return ret\n")
|
||||
|
||||
elif is_list_type (ret[0]):
|
||||
elif is_python_noninteger_type (ret[0]):
|
||||
if not functions_noexcept.has_key (name):
|
||||
if functions_list_exception_test.has_key (name):
|
||||
test = functions_list_exception_test[name]
|
||||
|
||||
Reference in New Issue
Block a user