@@ -48,9 +48,11 @@ static void initialize_type_structure(PyTypeObject* structure, const char* typna
48
48
truffle_invoke (PY_TRUFFLE_CEXT , "PyTruffle_Set_Ptr" , ptype , nativePointer );
49
49
50
50
unsigned long original_flags = structure -> tp_flags ;
51
+ Py_ssize_t basicsize = structure -> tp_basicsize ;
51
52
PyTypeObject * type_handle = truffle_assign_managed (structure , polyglot_as__typeobject (ptype ));
52
53
// write flags as specified in the dummy to the PythonClass object
53
54
type_handle -> tp_flags = original_flags | Py_TPFLAGS_READY ;
55
+ type_handle -> tp_basicsize = basicsize ;
54
56
}
55
57
56
58
static void initialize_globals () {
@@ -77,6 +79,12 @@ static void initialize_globals() {
77
79
truffle_assign_managed (& marker_struct , jerrormarker );
78
80
}
79
81
82
+ static void initialize_bufferprocs () {
83
+ polyglot_invoke (PY_TRUFFLE_CEXT , "PyTruffle_SetBufferProcs" , to_java ((PyObject * )& PyBytes_Type ), (getbufferproc )bytes_buffer_getbuffer , (releasebufferproc )NULL );
84
+ polyglot_invoke (PY_TRUFFLE_CEXT , "PyTruffle_SetBufferProcs" , to_java ((PyObject * )& PyByteArray_Type ), (getbufferproc )NULL , (releasebufferproc )NULL );
85
+ polyglot_invoke (PY_TRUFFLE_CEXT , "PyTruffle_SetBufferProcs" , to_java ((PyObject * )& PyBuffer_Type ), (getbufferproc )bufferdecorator_getbuffer , (releasebufferproc )NULL );
86
+ }
87
+
80
88
__attribute__((constructor ))
81
89
static void initialize_capi () {
82
90
// initialize base types
@@ -104,12 +112,14 @@ static void initialize_capi() {
104
112
initialize_type_structure (& PyFrozenSet_Type , "frozenset" );
105
113
initialize_type_structure (& PySet_Type , "set" );
106
114
initialize_type_structure (& PyEllipsis_Type , "ellipsis" );
115
+ initialize_type_structure (& PyBuffer_Type , "buffer" );
107
116
108
117
// initialize global variables like '_Py_NoneStruct', etc.
109
118
initialize_globals ();
110
119
111
120
initialize_exceptions ();
112
121
initialize_hashes ();
122
+ initialize_bufferprocs ();
113
123
}
114
124
115
125
void * native_to_java (PyObject * obj ) {
@@ -148,7 +158,9 @@ void* to_java_type(PyTypeObject* cls) {
148
158
149
159
__attribute__((always_inline ))
150
160
static inline PyObject * PyTruffle_Explicit_Cast (PyObject * cobj , unsigned long flags ) {
151
- if (PyTruffle_FastSubclass (flags , Py_TPFLAGS_TUPLE_SUBCLASS )) {
161
+ if (PyTruffle_FastSubclass (flags , Py_TPFLAGS_TYPE_SUBCLASS )) {
162
+ return (PyObject * )polyglot_as__typeobject (cobj );
163
+ } else if (PyTruffle_FastSubclass (flags , Py_TPFLAGS_TUPLE_SUBCLASS )) {
152
164
return (PyObject * )polyglot_as_PyTupleObject (cobj );
153
165
} else if (PyTruffle_FastSubclass (flags , Py_TPFLAGS_LIST_SUBCLASS )) {
154
166
return (PyObject * )polyglot_as_PyListObject (cobj );
@@ -158,13 +170,17 @@ static inline PyObject* PyTruffle_Explicit_Cast(PyObject* cobj, unsigned long fl
158
170
return (PyObject * )polyglot_as_PyUnicodeObject (cobj );
159
171
} else if (PyTruffle_FastSubclass (flags , Py_TPFLAGS_BYTES_SUBCLASS )) {
160
172
return (PyObject * )polyglot_as_PyBytesObject (cobj );
173
+ } else if (PyTruffle_FastSubclass (flags , Py_TPFLAGS_LONG_SUBCLASS )) {
174
+ return (PyObject * )polyglot_as__longobject (cobj );
175
+ } else if (PyTruffle_FastSubclass (flags , Py_TPFLAGS_BASE_EXC_SUBCLASS )) {
176
+ return (PyObject * )polyglot_as_PyBaseExceptionObject (cobj );
161
177
}
162
178
return (PyObject * )polyglot_as_PyVarObject (cobj );
163
179
}
164
180
165
181
166
182
__attribute__((always_inline ))
167
- static inline PyObject * _explicit_cast (PyObject * cobj ) {
183
+ inline PyObject * explicit_cast (PyObject * cobj ) {
168
184
if (polyglot_is_value (cobj )) {
169
185
unsigned long flags = polyglot_as_i64 (polyglot_invoke (PY_TRUFFLE_CEXT , "PyTruffle_GetTpFlags" , cobj ));
170
186
return PyTruffle_Explicit_Cast (cobj , flags );
@@ -173,7 +189,7 @@ static inline PyObject* _explicit_cast(PyObject* cobj) {
173
189
}
174
190
175
191
PyObject * to_sulong (void * o ) {
176
- return _explicit_cast (truffle_invoke (PY_TRUFFLE_CEXT , "to_sulong" , o ));
192
+ return explicit_cast (truffle_invoke (PY_TRUFFLE_CEXT , "to_sulong" , o ));
177
193
}
178
194
179
195
void * get_ob_type (PyObject * obj ) {
@@ -209,6 +225,12 @@ PyTypeObject* PyObjectHandle_ForJavaType(void* jobj) {
209
225
return jobj ;
210
226
}
211
227
228
+ /** to be used from Java code only; creates the deref handle for a sequence wrapper */
229
+ void * NativeHandle_ForArray (void * jobj , ssize_t element_size ) {
230
+ // TODO do polyglot typecast depending on element_size
231
+ return truffle_deref_handle_for_managed (jobj );
232
+ }
233
+
212
234
const char * PyTruffle_StringToCstr (void * jlString ) {
213
235
return truffle_string_to_cstr (jlString );
214
236
}
@@ -437,78 +459,101 @@ typedef PyObject* (*f20)(PyObject*, PyObject*, PyObject*, PyObject*, PyObject*,
437
459
438
460
#define _PICK_FUN_CAST (DUMMY , _0 , _1 , _2 , _3 , _4 , _5 , _6 , _7 , _8 , _9 , _10 , _11 , _12 , _13 , _14 , _15 , _16 , _17 , _18 , _19 , NAME , ...) NAME
439
461
#define _CALL_ARITY (FUN , ...) ( (_PICK_FUN_CAST(NULL, ##__VA_ARGS__, f20, f19, f18, f17, f16, f15, f14, f13, f12, f11, f10, f9, f8, f7, f6, f5, f4, f3, f2, f1, f0))(FUN))(__VA_ARGS__)
440
- #define ARG (__n ) _explicit_cast ((PyObject*)polyglot_get_arg((__n)))
462
+ #define ARG (__n ) explicit_cast ((PyObject*)polyglot_get_arg((__n)))
441
463
442
- PyObject * wrap_direct (PyCFunction fun , ...) {
464
+ void * wrap_direct (PyCFunction fun , ...) {
443
465
PyObject * res = NULL ;
444
466
switch (polyglot_get_arg_count ()- 1 ) {
445
467
case 0 :
446
- return _CALL_ARITY (fun );
468
+ res = _CALL_ARITY (fun );
469
+ break ;
447
470
case 1 :
448
- return _CALL_ARITY (fun , ARG (1 ));
471
+ res = _CALL_ARITY (fun , ARG (1 ));
472
+ break ;
449
473
case 2 :
450
- return _CALL_ARITY (fun , ARG (1 ), ARG (2 ));
474
+ res = _CALL_ARITY (fun , ARG (1 ), ARG (2 ));
475
+ break ;
451
476
case 3 :
452
- return _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ));
477
+ res = _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ));
478
+ break ;
453
479
case 4 :
454
- return _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ));
480
+ res = _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ));
481
+ break ;
455
482
case 5 :
456
- return _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ));
483
+ res = _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ));
484
+ break ;
457
485
case 6 :
458
- return _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ));
486
+ res = _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ));
487
+ break ;
459
488
case 7 :
460
- return _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ), ARG (7 ));
489
+ res = _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ), ARG (7 ));
490
+ break ;
461
491
case 8 :
462
- return _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ), ARG (7 ), ARG (8 ));
492
+ res = _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ), ARG (7 ), ARG (8 ));
493
+ break ;
463
494
case 9 :
464
- return _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ), ARG (7 ), ARG (8 ), ARG (9 ));
495
+ res = _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ), ARG (7 ), ARG (8 ), ARG (9 ));
496
+ break ;
465
497
case 10 :
466
- return _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ), ARG (7 ), ARG (8 ), ARG (9 ), ARG (10 ));
498
+ res = _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ), ARG (7 ), ARG (8 ), ARG (9 ), ARG (10 ));
499
+ break ;
467
500
case 11 :
468
- return _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ), ARG (7 ), ARG (8 ), ARG (9 ), ARG (10 ), ARG (11 ));
501
+ res = _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ), ARG (7 ), ARG (8 ), ARG (9 ), ARG (10 ), ARG (11 ));
502
+ break ;
469
503
case 12 :
470
- return _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ), ARG (7 ), ARG (8 ), ARG (9 ), ARG (10 ), ARG (11 ), ARG (12 ));
504
+ res = _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ), ARG (7 ), ARG (8 ), ARG (9 ), ARG (10 ), ARG (11 ), ARG (12 ));
505
+ break ;
471
506
case 13 :
472
- return _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ), ARG (7 ), ARG (8 ), ARG (9 ), ARG (10 ), ARG (11 ), ARG (12 ), ARG (13 ));
507
+ res = _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ), ARG (7 ), ARG (8 ), ARG (9 ), ARG (10 ), ARG (11 ), ARG (12 ), ARG (13 ));
508
+ break ;
473
509
case 14 :
474
- return _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ), ARG (7 ), ARG (8 ), ARG (9 ), ARG (10 ), ARG (11 ), ARG (12 ), ARG (13 ), ARG (14 ));
510
+ res = _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ), ARG (7 ), ARG (8 ), ARG (9 ), ARG (10 ), ARG (11 ), ARG (12 ), ARG (13 ), ARG (14 ));
511
+ break ;
475
512
case 15 :
476
- return _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ), ARG (7 ), ARG (8 ), ARG (9 ), ARG (10 ), ARG (11 ), ARG (12 ), ARG (13 ), ARG (14 ), ARG (15 ));
513
+ res = _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ), ARG (7 ), ARG (8 ), ARG (9 ), ARG (10 ), ARG (11 ), ARG (12 ), ARG (13 ), ARG (14 ), ARG (15 ));
514
+ break ;
477
515
case 16 :
478
- return _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ), ARG (7 ), ARG (8 ), ARG (9 ), ARG (10 ), ARG (11 ), ARG (12 ), ARG (13 ), ARG (14 ), ARG (15 ), ARG (16 ));
516
+ res = _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ), ARG (7 ), ARG (8 ), ARG (9 ), ARG (10 ), ARG (11 ), ARG (12 ), ARG (13 ), ARG (14 ), ARG (15 ), ARG (16 ));
517
+ break ;
479
518
case 17 :
480
- return _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ), ARG (7 ), ARG (8 ), ARG (9 ), ARG (10 ), ARG (11 ), ARG (12 ), ARG (13 ), ARG (14 ), ARG (15 ), ARG (16 ), ARG (17 ));
519
+ res = _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ), ARG (7 ), ARG (8 ), ARG (9 ), ARG (10 ), ARG (11 ), ARG (12 ), ARG (13 ), ARG (14 ), ARG (15 ), ARG (16 ), ARG (17 ));
520
+ break ;
481
521
case 18 :
482
- return _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ), ARG (7 ), ARG (8 ), ARG (9 ), ARG (10 ), ARG (11 ), ARG (12 ), ARG (13 ), ARG (14 ), ARG (15 ), ARG (16 ), ARG (17 ), ARG (18 ));
522
+ res = _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ), ARG (7 ), ARG (8 ), ARG (9 ), ARG (10 ), ARG (11 ), ARG (12 ), ARG (13 ), ARG (14 ), ARG (15 ), ARG (16 ), ARG (17 ), ARG (18 ));
523
+ break ;
483
524
case 19 :
484
- return _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ), ARG (7 ), ARG (8 ), ARG (9 ), ARG (10 ), ARG (11 ), ARG (12 ), ARG (13 ), ARG (14 ), ARG (15 ), ARG (16 ), ARG (17 ), ARG (18 ), ARG (19 ));
525
+ res = _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ), ARG (7 ), ARG (8 ), ARG (9 ), ARG (10 ), ARG (11 ), ARG (12 ), ARG (13 ), ARG (14 ), ARG (15 ), ARG (16 ), ARG (17 ), ARG (18 ), ARG (19 ));
526
+ break ;
485
527
case 20 :
486
- return _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ), ARG (7 ), ARG (8 ), ARG (9 ), ARG (10 ), ARG (11 ), ARG (12 ), ARG (13 ), ARG (14 ), ARG (15 ), ARG (16 ), ARG (17 ), ARG (18 ), ARG (19 ), ARG (20 ));
528
+ res = _CALL_ARITY (fun , ARG (1 ), ARG (2 ), ARG (3 ), ARG (4 ), ARG (5 ), ARG (6 ), ARG (7 ), ARG (8 ), ARG (9 ), ARG (10 ), ARG (11 ), ARG (12 ), ARG (13 ), ARG (14 ), ARG (15 ), ARG (16 ), ARG (17 ), ARG (18 ), ARG (19 ), ARG (20 ));
529
+ break ;
530
+ default :
531
+ _PyErr_BadInternalCall (__FILE__ , __LINE__ );
532
+ res = NULL ;
487
533
}
488
- _PyErr_BadInternalCall (__FILE__ , __LINE__ );
489
- return NULL ;
534
+ return native_to_java (res );
490
535
}
491
536
492
- PyObject * wrap_varargs (PyCFunction fun , PyObject * module , PyObject * varargs ) {
493
- return fun (module , _explicit_cast (varargs ));
537
+ void * wrap_varargs (PyCFunction fun , PyObject * module , PyObject * varargs ) {
538
+ return native_to_java ( fun (explicit_cast ( module ), explicit_cast (varargs ) ));
494
539
}
495
540
496
- PyObject * wrap_keywords (PyCFunctionWithKeywords fun , PyObject * module , PyObject * varargs , PyObject * kwargs ) {
497
- return fun (module , _explicit_cast (varargs ), _explicit_cast (kwargs ));
541
+ void * wrap_keywords (PyCFunctionWithKeywords fun , PyObject * module , PyObject * varargs , PyObject * kwargs ) {
542
+ return native_to_java ( fun (explicit_cast ( module ), explicit_cast (varargs ), explicit_cast (kwargs ) ));
498
543
}
499
544
500
- PyObject * wrap_noargs (PyCFunction fun , PyObject * module , PyObject * pnone ) {
501
- return fun (module , pnone );
545
+ void * wrap_noargs (PyCFunction fun , PyObject * module , PyObject * pnone ) {
546
+ return native_to_java ( fun (explicit_cast ( module ), explicit_cast ( pnone )) );
502
547
}
503
548
504
- PyObject * wrap_fastcall (_PyCFunctionFast fun , PyObject * self , PyObject * * args , Py_ssize_t nargs , PyObject * kwnames ) {
549
+ void * wrap_fastcall (_PyCFunctionFast fun , PyObject * self , PyObject * * args , Py_ssize_t nargs , PyObject * kwnames ) {
505
550
Py_ssize_t i ;
506
551
for (i = 0 ; i < nargs ; i ++ ) {
507
- args [i ] = _explicit_cast (args [i ]);
552
+ args [i ] = explicit_cast (args [i ]);
508
553
}
509
- return fun (self , args , nargs , _explicit_cast (kwnames ));
554
+ return native_to_java ( fun (explicit_cast ( self ) , args , nargs , explicit_cast (kwnames ) ));
510
555
}
511
556
512
- PyObject * wrap_unsupported (void * fun , ...) {
557
+ void * wrap_unsupported (void * fun , ...) {
513
558
return NULL ;
514
559
}
0 commit comments