aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--lang/python/pyme/util.py26
-rwxr-xr-xlang/python/tests/t-wrapper.py2
2 files changed, 18 insertions, 10 deletions
diff --git a/lang/python/pyme/util.py b/lang/python/pyme/util.py
index a8560992..a9fa19d2 100644
--- a/lang/python/pyme/util.py
+++ b/lang/python/pyme/util.py
@@ -74,19 +74,25 @@ class GpgmeWrapper(object):
if key[0] == '_' or self._getnameprepend() == None:
return None
name = self._getnameprepend() + key
+ func = getattr(pygpgme, name)
+
if self._errorcheck(name):
- def _funcwrap(*args, **kwargs):
- args = [self.wrapped] + list(args)
- return errorcheck(getattr(pygpgme, name)(*args, **kwargs),
+ def _funcwrap(slf, *args, **kwargs):
+ return errorcheck(func(slf.wrapped, *args, **kwargs),
"Invocation of " + name)
else:
- def _funcwrap(*args, **kwargs):
- args = [self.wrapped] + list(args)
- return getattr(pygpgme, name)(*args, **kwargs)
+ def _funcwrap(slf, *args, **kwargs):
+ return func(slf.wrapped, *args, **kwargs)
+
+ _funcwrap.__doc__ = getattr(func, "__doc__")
+
+ # Monkey-patch the class.
+ setattr(self.__class__, key, _funcwrap)
- _funcwrap.__doc__ = getattr(getattr(pygpgme, name), "__doc__")
+ # Bind the method to 'self'.
+ def wrapper(*args, **kwargs):
+ return _funcwrap(self, *args, **kwargs)
+ _funcwrap.__doc__ = getattr(func, "__doc__")
- # Cache the wrapper function.
- setattr(self, key, _funcwrap)
- return _funcwrap
+ return wrapper
diff --git a/lang/python/tests/t-wrapper.py b/lang/python/tests/t-wrapper.py
index acc2ecfd..fab0d811 100755
--- a/lang/python/tests/t-wrapper.py
+++ b/lang/python/tests/t-wrapper.py
@@ -20,4 +20,6 @@
from pyme import core
d0 = core.Data()
+d0.seek # trigger on-demand-wrapping
assert d0.seek == d0.seek, "Generated wrapper functions are not cached"
+assert hasattr(core.Data, 'seek'), "Generated wrapper functions are not shared"