@@ -147,10 +147,8 @@ static PyObject* wrap_pow(ternaryfunc f, ...) {
147
147
int nargs = polyglot_get_arg_count ();
148
148
switch (nargs ) {
149
149
case 3 :
150
- // TODO use 'native_to_java' on result
151
150
return f (polyglot_get_arg (1 ), polyglot_get_arg (2 ), Py_None );
152
151
case 4 :
153
- // TODO use 'native_to_java' on result
154
152
return f (polyglot_get_arg (1 ), polyglot_get_arg (2 ), polyglot_get_arg (3 ));
155
153
}
156
154
return Py_NoValue ;
@@ -231,21 +229,36 @@ inherit_special(PyTypeObject *type, PyTypeObject *base)
231
229
type -> tp_flags |= Py_TPFLAGS_DICT_SUBCLASS ;
232
230
}
233
231
234
-
235
- // TODO(fa): there should actually be 'native_to_java' just in case 'javacls' goes to native in between
236
232
// TODO support member flags other than READONLY
237
233
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
+
238
260
#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__))
249
262
250
263
251
264
UPCALL_ID (PyTruffle_Type_Slots );
@@ -261,20 +274,10 @@ int PyType_Ready(PyTypeObject* cls) {
261
274
#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)
262
275
#define ADD_SLOT (name , meth , flags ) ADD_METHOD_OR_SLOT(name, get_method_flags_cwrapper(flags), meth, flags, name)
263
276
#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
+ }
278
281
279
282
// https://docs.python.org/3/c-api/typeobj.html#Py_TPFLAGS_READY
280
283
if ((cls -> tp_flags & Py_TPFLAGS_READY ) || (cls -> tp_flags & Py_TPFLAGS_READYING )) {
@@ -544,7 +547,7 @@ int PyType_Ready(PyTypeObject* cls) {
544
547
545
548
UPCALL_ID (PyTruffle_Type_Modified );
546
549
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 ));
548
551
}
549
552
550
553
MUST_INLINE static int valid_identifier (PyObject * s ) {
@@ -557,16 +560,7 @@ MUST_INLINE static int valid_identifier(PyObject *s) {
557
560
return 1 ;
558
561
}
559
562
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'. */
570
564
Py_ssize_t PyTruffle_Type_AddSlots (PyTypeObject * cls , PyObject * slotsTuple ) {
571
565
int i ;
572
566
Py_ssize_t cur_offset = cls -> tp_basicsize ;
0 commit comments