Skip to content

Commit bd6890e

Browse files
committed
Wrap native 'getset' descriptor functions.
1 parent ce7c23e commit bd6890e

File tree

3 files changed

+26
-14
lines changed

3 files changed

+26
-14
lines changed

graalpython/com.oracle.graal.python.cext/src/capi.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ void* wrap_unsupported(void *fun, ...);
142142
truffle_read(PY_TRUFFLE_CEXT, "METH_UNSUPPORTED")))))))
143143

144144
#define get_method_flags_cwrapper(flags) \
145-
(void*)((((flags) < 0) ? \
145+
(void*)((((flags) < 0) ? \
146146
wrap_direct : \
147147
(((flags) & METH_KEYWORDS) ? \
148148
wrap_keywords : \
@@ -156,7 +156,6 @@ void* wrap_unsupported(void *fun, ...);
156156
wrap_fastcall : \
157157
wrap_unsupported)))))))
158158

159-
160159
#define PY_TRUFFLE_TYPE(__TYPE_NAME__, __SUPER_TYPE__, __FLAGS__, __SIZE__) {\
161160
PyVarObject_HEAD_INIT((__SUPER_TYPE__), 0)\
162161
__TYPE_NAME__, /* tp_name */\

graalpython/com.oracle.graal.python.cext/src/object.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -318,12 +318,16 @@ int PyType_Ready(PyTypeObject* cls) {
318318
int i = 0;
319319
PyGetSetDef getset = getsets[i];
320320
while (getset.name != NULL) {
321+
getter getter_fun = getset.get;
322+
setter setter_fun = getset.set;
321323
truffle_invoke(PY_TRUFFLE_CEXT,
322324
"AddGetSet",
323325
javacls,
324326
truffle_read_string(getset.name),
325-
truffle_address_to_function(getset.get),
326-
truffle_address_to_function(getset.set),
327+
getter_fun != NULL ? getter_fun : to_java(Py_None),
328+
wrap_direct,
329+
setter_fun != NULL ? setter_fun : to_java(Py_None),
330+
wrap_direct,
327331
getset.doc ? truffle_read_string(getset.doc) : truffle_read_string(""),
328332
// do not convert the closure, it is handed to the
329333
// getter and setter as-is

graalpython/lib-graalpython/python_cext.py

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -656,21 +656,30 @@ def member_setter(self, value):
656656
object.__setattr__(primary, name, member)
657657

658658

659-
def AddGetSet(primary, name, getter, setter, doc, closure):
659+
def AddGetSet(primary, name, getter, getter_wrapper, setter, setter_wrapper, doc, closure):
660660
getset = property()
661-
getter_w = CreateFunction(name, getter)
662-
def member_getter(self):
663-
return capi_to_java(getter_w(self, closure))
664-
getset.getter(member_getter)
665-
setter_w = CreateFunction(name, setter)
666-
def member_setter(self, value):
667-
setter_w(self, value, closure)
668-
return None
669-
getset.setter(member_setter)
661+
if getter:
662+
getter_w = CreateFunction(name, getter, getter_wrapper)
663+
def member_getter(self):
664+
return capi_to_java(getter_w(self, closure))
665+
666+
getset.getter(member_getter)
667+
if setter:
668+
setter_w = CreateFunction(name, setter, setter_wrapper)
669+
def member_setter(self, value):
670+
setter_w(self, value, closure)
671+
return None
672+
getset.setter(member_setter)
673+
else:
674+
getset.setter(lambda self, value: GetSet_SetNotWritable(self, value, name))
670675
getset.__doc__ = doc
671676
object.__setattr__(primary, name, getset)
672677

673678

679+
def GetSet_SetNotWritable(self, value, attr):
680+
raise AttributeError("attribute '%s' of '%s' objects is not writable" % (attr, type(self).__name__))
681+
682+
674683
def PyObject_Str(o):
675684
return str(o)
676685

0 commit comments

Comments
 (0)