Skip to content

Commit 9d516a2

Browse files
committed
refactor memoryview class setup slightly. this gets us through the preinitialization for svm
1 parent a6d8e13 commit 9d516a2

File tree

1 file changed

+26
-59
lines changed

1 file changed

+26
-59
lines changed

graalpython/lib-graalpython/memoryview.py

Lines changed: 26 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -39,76 +39,43 @@
3939

4040
# memoryview is mainly implemented in C
4141

42-
def make_init():
43-
def __memoryview_init(self, *args, **kwargs):
44-
import _memoryview
45-
self.__c_memoryview = _memoryview.nativememoryview(*args, **kwargs)
4642

47-
return __memoryview_init
43+
def __memoryview_init(self, *args, **kwargs):
44+
import _memoryview
45+
self.__c_memoryview = _memoryview.nativememoryview(*args, **kwargs)
4846

4947

50-
def make_getitem():
51-
def __memoryview_getitem(self, key):
52-
res = self.__c_memoryview.__getitem__(key)
53-
return memoryview(res) if isinstance(res, type(self.__c_memoryview)) else res
54-
return __memoryview_getitem
48+
def __memoryview_getitem(self, key):
49+
res = self.__c_memoryview.__getitem__(key)
50+
return memoryview(res) if isinstance(res, type(self.__c_memoryview)) else res
5551

5652

5753
def make_property(name):
58-
template = """def {0}_getter(self):
59-
return self.__c_memoryview.{0}
54+
@property
55+
def getter(self):
56+
return getattr(self.__c_memoryview, name)
6057

61-
{0} = property({0}_getter)
58+
error_string = "attribute '%s' of 'memoryview' objects is not writable" % name
59+
@getter.setter
60+
def setter(self, value):
61+
raise AttributeError(error_string)
6262

63-
def {0}_setter(self, value):
64-
raise AttributeError("attribute '{0}' of 'memoryview' objects is not writable")
63+
getter.__name__ = name
64+
return getter
6565

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)
7266

67+
for p in ["nbytes", "readonly", "itemsize", "format", "ndim", "shape", "strides",
68+
"suboffsets", "c_contiguous", "f_contiguous", "contiguous"]:
69+
setattr(memoryview, p, make_property(p))
7370

74-
# delegate methods
75-
memoryview.__init__ = make_init()
76-
memoryview.__repr__ = lambda self: self.__c_memoryview.__repr__()
77-
memoryview.__len__ = lambda self: self.__c_memoryview.__len__()
78-
memoryview.__getitem__ = make_getitem()
79-
memoryview.__setitem__ = lambda self, key, value: self.__c_memoryview.__setitem__(key, value)
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__()
8771

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")
72+
for p in ["__repr__", "__len__", "release", "tobytes", "hex", "tolist",
73+
"__enter__", "__exit__"]:
74+
setattr(memoryview, p, lambda self: getattr(self.__c_memoryview, p)())
10075

10176

102-
del make_init
103-
del make_getitem
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
77+
# other delegate methods
78+
memoryview.__init__ = __memoryview_init
79+
memoryview.__getitem__ = __memoryview_getitem
80+
memoryview.__setitem__ = lambda self, key, value: self.__c_memoryview.__setitem__(key, value)
81+
memoryview.cast = lambda self, *args: self.__c_memoryview.cast(*args)

0 commit comments

Comments
 (0)