43
43
#define REAL_SIZE_TP (tp ) PyLong_AsSsize_t(PyDict_GetItem((tp)->tp_dict, polyglot_from_string("n_fields", SRC_CS)))
44
44
#define REAL_SIZE (op ) REAL_SIZE_TP(Py_TYPE(op))
45
45
46
+ char * PyStructSequence_UnnamedField = "unnamed field" ;
47
+
46
48
static void
47
49
structseq_dealloc (PyStructSequence * obj )
48
50
{
@@ -61,10 +63,23 @@ PyObject* PyStructSequence_New(PyTypeObject* o) {
61
63
return UPCALL_CEXT_O (_jls_PyStructSequence_New , native_type_to_java (o ));
62
64
}
63
65
64
- typedef int (* structseq_init_fun_t )(void * , void * , void * , void * , void * );
66
+ static Py_ssize_t
67
+ count_members (PyStructSequence_Desc * desc , Py_ssize_t * n_unnamed_members ) {
68
+ Py_ssize_t i ;
69
+
70
+ * n_unnamed_members = 0 ;
71
+ for (i = 0 ; desc -> fields [i ].name != NULL ; ++ i ) {
72
+ if (desc -> fields [i ].name == PyStructSequence_UnnamedField ) {
73
+ (* n_unnamed_members )++ ;
74
+ }
75
+ }
76
+ return i ;
77
+ }
78
+
79
+ typedef int (* structseq_init_fun_t )(void * , void * , void * , void * , void * , int );
65
80
UPCALL_TYPED_ID (PyStructSequence_InitType2 , structseq_init_fun_t );
66
81
int PyStructSequence_InitType2 (PyTypeObject * type , PyStructSequence_Desc * desc ) {
67
- Py_ssize_t n_members = desc -> n_in_sequence ;
82
+ Py_ssize_t n_members , n_unnamed_members , n_named_members ;
68
83
Py_ssize_t i ;
69
84
70
85
memset (type , 0 , sizeof (PyTypeObject ));
@@ -74,36 +89,41 @@ int PyStructSequence_InitType2(PyTypeObject *type, PyStructSequence_Desc *desc)
74
89
type -> tp_name = desc -> name ;
75
90
type -> tp_basicsize = sizeof (PyStructSequence ) - sizeof (PyObject * );
76
91
type -> tp_itemsize = sizeof (PyObject * );
77
- //type->tp_repr = newType->tp_repr;
78
92
type -> tp_flags = Py_TPFLAGS_DEFAULT ;
79
93
type -> tp_members = NULL ;
80
- //type->tp_new = newType->tp_new;
81
94
type -> tp_doc = desc -> doc ;
82
95
type -> tp_base = & PyTuple_Type ;
83
- //type->tp_alloc = newType->tp_alloc;
84
96
type -> tp_dealloc = (destructor )structseq_dealloc ;
85
97
86
98
// now initialize the type
87
99
if (PyType_Ready (type ) < 0 )
88
100
return -1 ;
89
101
Py_INCREF (type );
90
102
103
+ n_members = count_members (desc , & n_unnamed_members );
104
+ n_named_members = n_members - n_unnamed_members ;
91
105
// put field names and doc strings into two lists
92
- void * * field_names = (void * * ) truffle_managed_malloc (n_members * sizeof (void * ));
93
- void * * field_docs = (void * * ) truffle_managed_malloc (n_members * sizeof (void * ));
106
+ void * * field_names = (void * * ) truffle_managed_malloc (n_named_members * sizeof (void * ));
107
+ void * * field_docs = (void * * ) truffle_managed_malloc (n_named_members * sizeof (void * ));
94
108
PyStructSequence_Field * fields = desc -> fields ;
109
+ int j = 0 ;
95
110
for (i = 0 ; i < n_members ; i ++ ) {
96
- field_names [i ] = polyglot_from_string (fields [i ].name , SRC_CS );
97
- field_docs [i ] = polyglot_from_string (fields [i ].doc , SRC_CS );
111
+ if (fields [i ].name != PyStructSequence_UnnamedField ) {
112
+ field_names [j ] = polyglot_from_string (fields [i ].name , SRC_CS );
113
+ field_docs [j ] = polyglot_from_string (fields [i ].doc , SRC_CS );
114
+ j ++ ;
115
+ }
98
116
}
99
117
100
118
// this initializes the type dict (adds attributes)
101
119
return _jls_PyStructSequence_InitType2 (
102
120
native_type_to_java (type ),
103
121
polyglot_from_string (desc -> name , SRC_CS ),
104
122
polyglot_from_string (desc -> doc , SRC_CS ),
105
- polyglot_from_PyObjectPtr_array (field_names , n_members ),
106
- polyglot_from_PyObjectPtr_array (field_docs , n_members )
123
+ /* TODO(fa): use polyglot_from_VoidPtr_array once this is visible */
124
+ polyglot_from_PyObjectPtr_array ((PyObjectPtr * ) field_names , (uint64_t ) n_members ),
125
+ polyglot_from_PyObjectPtr_array ((PyObjectPtr * ) field_docs , (uint64_t ) n_members ),
126
+ desc -> n_in_sequence
107
127
);
108
128
}
109
129
0 commit comments