@@ -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
237233UPCALL_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
251264UPCALL_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
545548UPCALL_ID (PyTruffle_Type_Modified );
546549void 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
550553MUST_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'. */
570564Py_ssize_t PyTruffle_Type_AddSlots (PyTypeObject * cls , PyObject * slotsTuple ) {
571565 int i ;
572566 Py_ssize_t cur_offset = cls -> tp_basicsize ;
0 commit comments