Author: Armin Rigo <[email protected]>
Branch: cffi-1.0
Changeset: r77194:36252eaabebf
Date: 2015-05-08 09:39 +0200
http://bitbucket.org/pypy/pypy/changeset/36252eaabebf/
Log: Writing to global vars
diff --git a/pypy/module/_cffi_backend/cglob.py
b/pypy/module/_cffi_backend/cglob.py
--- a/pypy/module/_cffi_backend/cglob.py
+++ b/pypy/module/_cffi_backend/cglob.py
@@ -12,5 +12,8 @@
def read_global_var(self):
return self.w_ctype.convert_to_object(self.ptr)
+ def write_global_var(self, w_newvalue):
+ self.w_ctype.convert_from_object(self.ptr, w_newvalue)
+
W_GlobSupport.typedef = TypeDef("FFIGlobSupport")
W_GlobSupport.typedef.acceptable_as_base_class = False
diff --git a/pypy/module/_cffi_backend/lib_obj.py
b/pypy/module/_cffi_backend/lib_obj.py
--- a/pypy/module/_cffi_backend/lib_obj.py
+++ b/pypy/module/_cffi_backend/lib_obj.py
@@ -26,7 +26,7 @@
XXX
@jit.elidable_promote()
- def _get_attr(self, attr):
+ def _get_attr_elidable(self, attr):
try:
w_result = self.dict_w[attr]
except KeyError:
@@ -73,26 +73,42 @@
self.dict_w[attr] = w_result
return w_result
- def _no_such_attr(self, attr):
- raise oefmt(self.space.w_AttributeError,
- "cffi lib '%s' has no function,"
- " global variable or constant named '%s'",
- self.libname, attr)
+ def _get_attr(self, w_attr):
+ attr = self.space.str_w(w_attr)
+ w_value = self._get_attr_elidable(attr)
+ if w_value is None:
+ raise oefmt(self.space.w_AttributeError,
+ "cffi lib '%s' has no function,"
+ " global variable or constant named '%s'",
+ self.libname, attr)
+ return w_value
def descr_getattribute(self, w_attr):
- space = self.space
- attr = space.str_w(w_attr)
- w_value = self._get_attr(attr)
- if w_value is None:
- raise self._no_such_attr(attr)
- elif isinstance(w_value, cglob.W_GlobSupport):
+ w_value = self._get_attr(w_attr)
+ if isinstance(w_value, cglob.W_GlobSupport):
w_value = w_value.read_global_var()
return w_value
+ def descr_setattr(self, w_attr, w_newvalue):
+ w_value = self._get_attr(w_attr)
+ if isinstance(w_value, cglob.W_GlobSupport):
+ w_value.write_global_var(w_newvalue)
+ else:
+ raise oefmt(self.space.w_AttributeError,
+ "cannot write to function or constant '%s'",
+ self.space.str_w(w_attr))
+
+ def descr_delattr(self, w_attr):
+ self._get_attr(w_attr) # for the possible AttributeError
+ raise oefmt(self.space.w_AttributeError,
+ "C attribute cannot be deleted")
+
W_LibObject.typedef = TypeDef(
'CompiledLib',
__repr__ = interp2app(W_LibObject.descr_repr),
__getattribute__ = interp2app(W_LibObject.descr_getattribute),
+ __setattr__ = interp2app(W_LibObject.descr_setattr),
+ __delattr__ = interp2app(W_LibObject.descr_delattr),
)
W_LibObject.typedef.acceptable_as_base_class = False
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit