Skip to content

Commit 0226ad6

Browse files
committed
Also delegate properties of 'memoryview' to 'nativememoryview'.
1 parent ff869e7 commit 0226ad6

File tree

1 file changed

+50
-11
lines changed

1 file changed

+50
-11
lines changed

graalpython/lib-graalpython/memoryview.py

Lines changed: 50 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -46,30 +46,69 @@ def __memoryview_init(self, *args, **kwargs):
4646

4747
return __memoryview_init
4848

49+
4950
def make_getitem():
5051
def __memoryview_getitem(self, key):
5152
res = self.__c_memoryview.__getitem__(key)
5253
return memoryview(res) if isinstance(res, type(self.__c_memoryview)) else res
5354
return __memoryview_getitem
5455

55-
def make_readonly():
56-
class Dummy:
57-
@property
58-
def readonly(self):
59-
return self.__c_memoryview.readonly
6056

61-
@readonly.setter
62-
def readonly(self, value):
63-
raise AttributeError("attribute 'readonly' of 'memoryview' objects is not writable")
64-
return Dummy.readonly
57+
def make_property(name):
58+
template = """def {0}_getter(self):
59+
return self.__c_memoryview.{0}
60+
61+
{0} = property({0}_getter)
62+
63+
def {0}_setter(self, value):
64+
raise AttributeError("attribute '{0}' of 'memoryview' objects is not writable")
65+
66+
{0} = {0}.setter({0}_setter)"""
67+
# use dict for globals and locals to avoid name conflicts
68+
_globals = dict(globals())
69+
_locals = dict()
70+
exec(template.format(name), _globals, _locals)
71+
return eval(name, _globals, _locals)
6572

73+
74+
# delegate methods
6675
memoryview.__init__ = make_init()
6776
memoryview.__repr__ = lambda self: self.__c_memoryview.__repr__()
6877
memoryview.__len__ = lambda self: self.__c_memoryview.__len__()
6978
memoryview.__getitem__ = make_getitem()
7079
memoryview.__setitem__ = lambda self, key, value: self.__c_memoryview.__setitem__(key, value)
71-
memoryview.readonly = make_readonly()
80+
memoryview.release = lambda self: self.__c_memoryview.release()
81+
memoryview.tobytes = lambda self: self.__c_memoryview.tobytes()
82+
memoryview.hex = lambda self: self.__c_memoryview.hex()
83+
memoryview.tolist = lambda self: self.__c_memoryview.tolist()
84+
memoryview.cast = lambda self, *args: self.__c_memoryview.cast(*args)
85+
memoryview.__enter__ = lambda self: self.__c_memoryview.__enter__()
86+
memoryview.__exit__ = lambda self: self.__c_memoryview.__exit__()
87+
88+
# delegate properties
89+
memoryview.nbytes = make_property("nbytes")
90+
memoryview.readonly = make_property("readonly")
91+
memoryview.itemsize = make_property("itemsize")
92+
memoryview.format = make_property("format")
93+
memoryview.ndim = make_property("ndim")
94+
memoryview.shape = make_property("shape")
95+
memoryview.strides = make_property("strides")
96+
memoryview.suboffsets = make_property("suboffsets")
97+
memoryview.c_contiguous = make_property("c_contiguous")
98+
memoryview.f_contiguous = make_property("f_contiguous")
99+
memoryview.contiguous = make_property("contiguous")
100+
72101

73102
del make_init
74103
del make_getitem
75-
del make_readonly
104+
# del make_nbytes
105+
# del make_readonly
106+
# del make_itemsize
107+
# del make_format
108+
# del make_ndim
109+
# del make_shape
110+
# del make_strides
111+
# del make_suboffsets
112+
# del make_c_contiguous
113+
# del make_f_contiguous
114+
# del make_contiguous

0 commit comments

Comments
 (0)