@@ -122,19 +122,19 @@ void initialize_type_structure(PyTypeObject* structure, PyTypeObject* ptype, pol
122
122
type_handle -> tp_basicsize = basicsize ;
123
123
type_handle -> tp_itemsize = itemsize ;
124
124
if (alloc_fun ) {
125
- type_handle -> tp_alloc = alloc_fun ;
125
+ type_handle -> tp_alloc = alloc_fun ;
126
126
}
127
127
if (dealloc_fun ) {
128
- type_handle -> tp_dealloc = dealloc_fun ;
128
+ type_handle -> tp_dealloc = dealloc_fun ;
129
129
}
130
130
if (free_fun ) {
131
- type_handle -> tp_free = free_fun ;
131
+ type_handle -> tp_free = free_fun ;
132
132
}
133
133
if (free_fun ) {
134
- type_handle -> tp_free = free_fun ;
134
+ type_handle -> tp_free = free_fun ;
135
135
}
136
136
if (vectorcall_offset ) {
137
- type_handle -> tp_vectorcall_offset = vectorcall_offset ;
137
+ type_handle -> tp_vectorcall_offset = vectorcall_offset ;
138
138
}
139
139
if (as_buffer ) {
140
140
type_handle -> tp_as_buffer = as_buffer ;
@@ -151,12 +151,12 @@ static void initialize_builtin_type(PyTypeObject* structure, const char* typname
151
151
#define init_hidden (a , b ) initialize ## a ## _ ## b ## _gen
152
152
#define init (a , b ) init_hidden(a, b)
153
153
154
- #define initialize_type (typeobject , typename , struct ) \
155
- ctor(__COUNTER__) \
156
- static void init(__COUNTER__, typeobject)(void) { \
157
- initialize_builtin_type(&typeobject, \
158
- #typename, \
159
- polyglot_ ## struct ## _typeid()); \
154
+ #define initialize_type (typeobject , typename , struct ) \
155
+ ctor(__COUNTER__) \
156
+ static void init(__COUNTER__, typeobject)(void) { \
157
+ initialize_builtin_type(&typeobject, \
158
+ #typename, \
159
+ polyglot_ ## struct ## _typeid()); \
160
160
}
161
161
162
162
#define declare_struct (typeobject , typename , struct ) \
@@ -224,7 +224,7 @@ POLYGLOT_DECLARE_TYPE(Py_buffer);
224
224
#define REGISTER_BASIC_TYPE (typename ) \
225
225
POLYGLOT_DECLARE_TYPE(typename); \
226
226
NO_INLINE polyglot_typeid get_ ## typename ## _typeid(void) { \
227
- return polyglot_ ## typename ## _typeid(); \
227
+ return polyglot_ ## typename ## _typeid(); \
228
228
}
229
229
230
230
/* just a renaming to avoid name clash with Java types */
@@ -269,8 +269,8 @@ REGISTER_BASIC_TYPE(PyThreadState);
269
269
#define REGISTER_POINTER_TYPE (basetype , ptrtype ) \
270
270
typedef basetype* ptrtype; \
271
271
POLYGLOT_DECLARE_TYPE(ptrtype); \
272
- NO_INLINE polyglot_typeid get_ ## ptrtype ## _typeid(void) { \
273
- return polyglot_array_typeid(polyglot_ ## basetype ## _typeid(), 1); \
272
+ NO_INLINE polyglot_typeid get_ ## ptrtype ## _typeid(void) { \
273
+ return polyglot_array_typeid(polyglot_ ## basetype ## _typeid(), 1); \
274
274
}
275
275
276
276
REGISTER_POINTER_TYPE (int64_t , int64_ptr_t );
@@ -396,77 +396,77 @@ Py_ssize_t get_ob_refcnt(PyObject* obj) {
396
396
397
397
/** to be used from Java code only; reads native 'tp_dict' field */
398
398
PyObject * get_tp_dict (PyTypeObject * obj ) {
399
- return native_to_java (obj -> tp_dict );
399
+ return native_to_java (obj -> tp_dict );
400
400
}
401
401
402
402
/** to be used from Java code only; reads native 'tp_base' field */
403
403
PyObject * get_tp_base (PyTypeObject * obj ) {
404
- return native_to_java ((PyObject * ) obj -> tp_base );
404
+ return native_to_java ((PyObject * ) obj -> tp_base );
405
405
}
406
406
407
407
/** to be used from Java code only; reads native 'tp_bases' field */
408
408
PyObject * get_tp_bases (PyTypeObject * obj ) {
409
- return native_to_java (obj -> tp_bases );
409
+ return native_to_java (obj -> tp_bases );
410
410
}
411
411
412
412
/** to be used from Java code only; reads native 'tp_name' field */
413
413
const char * get_tp_name (PyTypeObject * obj ) {
414
- return obj -> tp_name ;
414
+ return obj -> tp_name ;
415
415
}
416
416
417
417
/** to be used from Java code only; reads native 'tp_mro' field */
418
418
PyObject * get_tp_mro (PyTypeObject * obj ) {
419
- return native_to_java (obj -> tp_mro );
419
+ return native_to_java (obj -> tp_mro );
420
420
}
421
421
422
422
/** to be used from Java code only; reads native 'tp_subclasses' field */
423
423
PyObject * get_tp_subclasses (PyTypeObject * obj ) {
424
- return native_to_java (obj -> tp_subclasses );
424
+ return native_to_java (obj -> tp_subclasses );
425
425
}
426
426
427
427
/** to be used from Java code only; reads native 'tp_dictoffset' field */
428
428
Py_ssize_t get_tp_dictoffset (PyTypeObject * obj ) {
429
- return obj -> tp_dictoffset ;
429
+ return obj -> tp_dictoffset ;
430
430
}
431
431
432
432
/** to be used from Java code only; reads native 'tp_weaklistoffset' field */
433
433
Py_ssize_t get_tp_weaklistoffset (PyTypeObject * obj ) {
434
- return obj -> tp_weaklistoffset ;
434
+ return obj -> tp_weaklistoffset ;
435
435
}
436
436
437
437
/** to be used from Java code only; reads native 'tp_itemsize' field */
438
438
Py_ssize_t get_tp_itemsize (PyTypeObject * obj ) {
439
- return obj -> tp_itemsize ;
439
+ return obj -> tp_itemsize ;
440
440
}
441
441
442
442
/** to be used from Java code only; reads native 'tp_basicsize' field */
443
443
Py_ssize_t get_tp_basicsize (PyTypeObject * obj ) {
444
- return obj -> tp_basicsize ;
444
+ return obj -> tp_basicsize ;
445
445
}
446
446
447
447
/** to be used from Java code only; reads native 'tp_alloc' field */
448
448
allocfunc get_tp_alloc (PyTypeObject * obj ) {
449
- return obj -> tp_alloc ;
449
+ return obj -> tp_alloc ;
450
450
}
451
451
452
452
/** to be used from Java code only; reads native 'tp_dealloc' field */
453
453
destructor get_tp_dealloc (PyTypeObject * obj ) {
454
- return obj -> tp_dealloc ;
454
+ return obj -> tp_dealloc ;
455
455
}
456
456
457
457
/** to be used from Java code only; reads native 'tp_free' field */
458
458
freefunc get_tp_free (PyTypeObject * obj ) {
459
- return obj -> tp_free ;
459
+ return obj -> tp_free ;
460
460
}
461
461
462
462
/** to be used from Java code only; reads native 'tp_as_buffer' field */
463
463
PyBufferProcs * get_tp_as_buffer (PyTypeObject * obj ) {
464
- return obj -> tp_as_buffer ;
464
+ return obj -> tp_as_buffer ;
465
465
}
466
466
467
467
/** to be used from Java code only; reads native 'tp_flags' field */
468
468
unsigned long get_tp_flags (PyTypeObject * obj ) {
469
- return obj -> tp_flags ;
469
+ return obj -> tp_flags ;
470
470
}
471
471
472
472
POLYGLOT_DECLARE_TYPE (PyMethodDef );
@@ -530,17 +530,17 @@ polyglot_typeid get_newfunc_typeid() {
530
530
531
531
/** to be used from Java code only; calls INCREF */
532
532
void PyTruffle_INCREF (PyObject * obj ) {
533
- Py_INCREF (obj );
533
+ Py_INCREF (obj );
534
534
}
535
535
536
536
/** to be used from Java code only; calls DECREF */
537
537
void PyTruffle_DECREF (PyObject * obj ) {
538
- Py_DECREF (obj );
538
+ Py_DECREF (obj );
539
539
}
540
540
541
541
/** to be used from Java code only; calls DECREF */
542
542
Py_ssize_t PyTruffle_ADDREF (PyObject * obj , Py_ssize_t value ) {
543
- return (obj -> ob_refcnt += value );
543
+ return (obj -> ob_refcnt += value );
544
544
}
545
545
546
546
/** to be used from Java code only; calls DECREF */
@@ -558,27 +558,27 @@ Py_ssize_t PyTruffle_SUBREF(PyObject* obj, Py_ssize_t value) {
558
558
}
559
559
560
560
/** to be used from Java code only; calls DECREF */
561
- Py_ssize_t PyTruffle_bulk_SUBREF (PyObject * ptrArray [], Py_ssize_t values [], int64_t len ) {
562
- int64_t i ;
563
- PyObject * obj ;
564
- Py_ssize_t value ;
565
-
566
- for (i = 0 ; i < len ; i ++ ) {
567
- obj = ptrArray [i ];
568
- value = values [i ];
569
- /* IMPORTANT: 'value == 0' indicates we should not process the reference at all */
570
- if (value > 0 ) {
571
- Py_ssize_t new_value = ((obj -> ob_refcnt ) -= value );
572
- if (new_value == 0 ) {
573
- _Py_Dealloc (obj );
574
- }
561
+ Py_ssize_t PyTruffle_bulk_SUBREF (PyObject * ptrArray [], Py_ssize_t values [], int64_t len ) {
562
+ int64_t i ;
563
+ PyObject * obj ;
564
+ Py_ssize_t value ;
565
+
566
+ for (i = 0 ; i < len ; i ++ ) {
567
+ obj = ptrArray [i ];
568
+ value = values [i ];
569
+ /* IMPORTANT: 'value == 0' indicates we should not process the reference at all */
570
+ if (value > 0 ) {
571
+ Py_ssize_t new_value = ((obj -> ob_refcnt ) -= value );
572
+ if (new_value == 0 ) {
573
+ _Py_Dealloc (obj );
574
+ }
575
575
#ifdef Py_REF_DEBUG
576
- else if (new_value < 0 ) {
577
- _Py_NegativeRefcount (filename , lineno , op );
578
- }
576
+ else if (new_value < 0 ) {
577
+ _Py_NegativeRefcount (filename , lineno , op );
578
+ }
579
579
#endif
580
- }
581
- }
580
+ }
581
+ }
582
582
return 0 ;
583
583
}
584
584
@@ -591,12 +591,12 @@ uint64_t PyTruffle_Wchar_Size() {
591
591
}
592
592
593
593
/** free's a native pointer or releases a Sulong handle; DO NOT CALL WITH MANAGED POINTERS ! */
594
- void PyTruffle_Free (void * obj ) {
595
- if (points_to_handle_space (obj ) && is_handle (obj )) {
596
- release_handle (obj );
597
- } else {
598
- PyMem_RawFree (obj );
599
- }
594
+ void PyTruffle_Free (void * obj ) {
595
+ if (points_to_handle_space (obj ) && is_handle (obj )) {
596
+ release_handle (obj );
597
+ } else {
598
+ PyMem_RawFree (obj );
599
+ }
600
600
}
601
601
602
602
/** to be used from Java code only; creates the deref handle for a sequence wrapper */
@@ -706,10 +706,10 @@ void* ReadStringInPlaceMember(PyObject* object, Py_ssize_t offset) {
706
706
PyObject * ReadObjectMember (PyObject * object , Py_ssize_t offset ) {
707
707
PyObject * member = ReadMember (object , offset , PyObject * );
708
708
if (member == NULL ) {
709
- return Py_None ;
710
- } else {
711
- return native_to_java (member );
709
+ member = Py_None ;
712
710
}
711
+ Py_INCREF (member );
712
+ return native_to_java (member );
713
713
}
714
714
715
715
int ReadCharMember (PyObject * object , Py_ssize_t offset ) {
@@ -738,6 +738,7 @@ PyObject* ReadObjectExMember(PyObject* object, Py_ssize_t offset) {
738
738
PyErr_SetString (PyExc_ValueError , "member must not be NULL" );
739
739
return NULL ;
740
740
} else {
741
+ Py_INCREF (member );
741
742
return native_to_java (member );
742
743
}
743
744
}
@@ -788,21 +789,23 @@ int WriteStringMember(PyObject* object, Py_ssize_t offset, char* value) {
788
789
}
789
790
790
791
int WriteStringInPlaceMember (PyObject * object , Py_ssize_t offset , char * value ) {
791
- char * addr = (char * ) (((char * )object ) + offset );
792
- size_t n ;
793
- if (polyglot_has_array_elements (value )) {
794
- n = polyglot_get_array_size (value );
795
- } else {
796
- n = strlen (value );
797
- }
798
- memcpy (addr , value , n );
799
- return 0 ;
792
+ char * addr = (char * ) (((char * ) object ) + offset );
793
+ size_t n ;
794
+ if (polyglot_has_array_elements (value )) {
795
+ n = polyglot_get_array_size (value );
796
+ } else {
797
+ n = strlen (value );
798
+ }
799
+ memcpy (addr , value , n );
800
+ return 0 ;
800
801
}
801
802
802
803
int WriteObjectMember (PyObject * object , Py_ssize_t offset , PyObject * value ) {
803
- /* We first need to decref the old value. */
804
- Py_XDECREF (ReadMember (object , offset , PyObject * ));
804
+ /* We first need to decref the old value. */
805
+ PyObject * oldv = ReadMember (object , offset , PyObject * );
806
+ Py_XINCREF (value );
805
807
WriteMember (object , offset , value , PyObject * );
808
+ Py_XDECREF (oldv );
806
809
return 0 ;
807
810
}
808
811
@@ -837,12 +840,13 @@ int WriteULongMember(PyObject* object, Py_ssize_t offset, unsigned long value) {
837
840
}
838
841
839
842
int WriteObjectExMember (PyObject * object , Py_ssize_t offset , PyObject * value ) {
840
- PyObject * oldv = ReadMember (object , offset , PyObject * );
843
+ PyObject * oldv = ReadMember (object , offset , PyObject * );
841
844
if (oldv == NULL ) {
842
845
return 1 ;
843
846
}
844
- Py_XDECREF ( oldv );
847
+ Py_XINCREF ( value );
845
848
WriteMember (object , offset , value , PyObject * );
849
+ Py_XDECREF (oldv );
846
850
return 0 ;
847
851
}
848
852
@@ -905,7 +909,7 @@ void* truffle_ptr_add(void* x, Py_ssize_t y) {
905
909
}
906
910
907
911
double truffle_read_ob_fval (PyFloatObject * fobj ) {
908
- return fobj -> ob_fval ;
912
+ return fobj -> ob_fval ;
909
913
}
910
914
911
915
void truffle_memcpy_bytes (void * dest , size_t dest_offset , void * src , size_t src_offset , size_t len ) {
@@ -914,7 +918,7 @@ void truffle_memcpy_bytes(void *dest, size_t dest_offset, void *src, size_t src_
914
918
915
919
/* called from Java to get number of bits per long digit */
916
920
int32_t get_long_bits_in_digit () {
917
- return PYLONG_BITS_IN_DIGIT ;
921
+ return PYLONG_BITS_IN_DIGIT ;
918
922
}
919
923
920
924
void register_native_slots (PyTypeObject * managed_class , PyGetSetDef * getsets , PyMemberDef * members ) {
0 commit comments