Skip to content

Commit 5d64e88

Browse files
committed
Move logic of 'ADD_MEMBER' and 'ADD_SLOT' to C functions.
1 parent 9e82f9d commit 5d64e88

File tree

1 file changed

+33
-39
lines changed

1 file changed

+33
-39
lines changed

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

Lines changed: 33 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -147,10 +147,8 @@ static PyObject* wrap_pow(ternaryfunc f, ...) {
147147
int nargs = polyglot_get_arg_count();
148148
switch(nargs) {
149149
case 3:
150-
// TODO use 'native_to_java' on result
151150
return f(polyglot_get_arg(1), polyglot_get_arg(2), Py_None);
152151
case 4:
153-
// TODO use 'native_to_java' on result
154152
return f(polyglot_get_arg(1), polyglot_get_arg(2), polyglot_get_arg(3));
155153
}
156154
return Py_NoValue;
@@ -231,21 +229,36 @@ inherit_special(PyTypeObject *type, PyTypeObject *base)
231229
type->tp_flags |= Py_TPFLAGS_DICT_SUBCLASS;
232230
}
233231

234-
235-
// TODO(fa): there should actually be 'native_to_java' just in case 'javacls' goes to native in between
236232
// TODO support member flags other than READONLY
237233
UPCALL_ID(AddMember);
234+
static void add_member(PyTypeObject* cls, PyObject* type_dict, PyObject* mname, int mtype, Py_ssize_t moffset, int mflags, char* mdoc) {
235+
UPCALL_CEXT_VOID(_jls_AddMember,
236+
cls,
237+
native_to_java(type_dict),
238+
native_to_java(mname),
239+
mtype,
240+
moffset,
241+
native_to_java(((mflags & READONLY) == 0) ? Py_True : Py_False),
242+
polyglot_from_string(mdoc ? mdoc : "", SRC_CS)
243+
);
244+
}
245+
246+
static void add_method_or_slot(PyTypeObject* cls, PyObject* type_dict, char* name, void* meth, void* clanding, int flags, char* doc) {
247+
polyglot_invoke(PY_TRUFFLE_CEXT,
248+
"AddFunction",
249+
cls,
250+
native_to_java(type_dict),
251+
polyglot_from_string((name), SRC_CS),
252+
(meth),
253+
(clanding),
254+
get_method_flags_wrapper(flags),
255+
polyglot_from_string(doc, SRC_CS),
256+
(flags) > 0 && ((flags) & METH_CLASS) != 0,
257+
(flags) > 0 && ((flags) & METH_STATIC) != 0);
258+
}
259+
238260
#define ADD_MEMBER(__javacls__, __tpdict__, __mname__, __mtype__, __moffset__, __mflags__, __mdoc__) \
239-
do { \
240-
UPCALL_CEXT_VOID(_jls_AddMember, \
241-
(__javacls__), \
242-
native_to_java(__tpdict__), \
243-
(__mname__), \
244-
(__mtype__), \
245-
(__moffset__), \
246-
native_to_java((((__mflags__) & READONLY) == 0) ? Py_True : Py_False), \
247-
polyglot_from_string((__mdoc__) ? (__mdoc__) : "", SRC_CS)); \
248-
} while (0)
261+
add_member((__javacls__), (__tpdict__), (__mname__), (__mtype__), (__moffset__), (__mflags__), (__mdoc__))
249262

250263

251264
UPCALL_ID(PyTruffle_Type_Slots);
@@ -261,20 +274,10 @@ int PyType_Ready(PyTypeObject* cls) {
261274
#define ADD_METHOD(m) ADD_METHOD_OR_SLOT(m.ml_name, get_method_flags_cwrapper(m.ml_flags), m.ml_meth, m.ml_flags, m.ml_doc)
262275
#define ADD_SLOT(name, meth, flags) ADD_METHOD_OR_SLOT(name, get_method_flags_cwrapper(flags), meth, flags, name)
263276
#define ADD_SLOT_CONV(name, clanding, meth, flags) ADD_METHOD_OR_SLOT(name, clanding, meth, flags, name)
264-
#define ADD_METHOD_OR_SLOT(name, clanding, meth, flags, doc) \
265-
if (meth) { \
266-
polyglot_invoke(PY_TRUFFLE_CEXT, \
267-
"AddFunction", \
268-
cls, \
269-
native_to_java(dict), \
270-
polyglot_from_string((name), SRC_CS), \
271-
(meth), \
272-
(clanding), \
273-
get_method_flags_wrapper(flags), \
274-
polyglot_from_string(doc, SRC_CS), \
275-
(flags) > 0 && ((flags) & METH_CLASS) != 0, \
276-
(flags) > 0 && ((flags) & METH_STATIC) != 0); \
277-
}
277+
#define ADD_METHOD_OR_SLOT(__name__, __clanding__, __meth__, __flags__, __doc__) \
278+
if (__meth__) { \
279+
add_method_or_slot(cls, dict, (__name__), (__meth__), (__clanding__), (__flags__), (__doc__)); \
280+
}
278281

279282
// https://docs.python.org/3/c-api/typeobj.html#Py_TPFLAGS_READY
280283
if ((cls->tp_flags & Py_TPFLAGS_READY) || (cls->tp_flags & Py_TPFLAGS_READYING)) {
@@ -544,7 +547,7 @@ int PyType_Ready(PyTypeObject* cls) {
544547

545548
UPCALL_ID(PyTruffle_Type_Modified);
546549
void PyType_Modified(PyTypeObject* type) {
547-
UPCALL_CEXT_VOID(_jls_PyTruffle_Type_Modified, native_to_java(type), polyglot_from_string(type->tp_name, SRC_CS), native_to_java(type->tp_mro));
550+
UPCALL_CEXT_VOID(_jls_PyTruffle_Type_Modified, native_type_to_java(type), polyglot_from_string(type->tp_name, SRC_CS), native_to_java(type->tp_mro));
548551
}
549552

550553
MUST_INLINE static int valid_identifier(PyObject *s) {
@@ -557,16 +560,7 @@ MUST_INLINE static int valid_identifier(PyObject *s) {
557560
return 1;
558561
}
559562

560-
/*
561-
typedef struct PyMemberDef {
562-
char *name;
563-
int type;
564-
Py_ssize_t offset;
565-
int flags;
566-
char *doc;
567-
} PyMemberDef;
568-
569-
*/
563+
/* Add get-set descriptors for slots provided in 'slotsTuple'. */
570564
Py_ssize_t PyTruffle_Type_AddSlots(PyTypeObject* cls, PyObject* slotsTuple) {
571565
int i;
572566
Py_ssize_t cur_offset = cls->tp_basicsize;

0 commit comments

Comments
 (0)