@@ -29,8 +29,6 @@ typedef struct {
2929}
3030%fragment(" init_struct_info" , " header" , fragment=" struct_info_type" ) {
3131static void init_struct_info (struct_info& info, swig_type_info* type) {
32- if (!info.members .empty ())
33- return ;
3432 PyGetSetDef* getset =
3533 ((SwigPyClientData*)type->clientdata )->pytype ->tp_getset ;
3634 while (getset->name ) {
@@ -156,64 +154,53 @@ Python interface uses names without underscores."
156154 %fragment (" values_struct" );
157155 %fragment (" items_struct" );
158156 static PyObject* keys () {
159- init_info_%mangle (struct_type)();
160157 return keys_struct (info_%mangle (struct_type));
161158 }
162159 PyObject* values (PyObject* py_self) {
163- init_info_%mangle (struct_type)();
164160 return values_struct (info_%mangle (struct_type), py_self);
165161 }
166162 PyObject* items (PyObject* py_self) {
167- init_info_%mangle (struct_type)();
168163 return items_struct (info_%mangle (struct_type), py_self);
169164 }
170165 static PyObject* __iter__ () {
171166 // Deprecated since 2025-09-11
172167 PyErr_WarnEx (PyExc_DeprecationWarning,
173168 " Please iterate over keys() function output" , 1 );
174- init_info_%mangle (struct_type)();
175169 PyObject* seq = keys_struct (info_%mangle (struct_type));
176170 PyObject* result = PySeqIter_New (seq);
177171 Py_DECREF (seq);
178172 return result;
179173 }
180174}
181175%fragment(" struct_info" {struct_type}, " header" ,
182- fragment=" init_struct_info " ) {
176+ fragment=" struct_info_type " ) {
183177static struct_info info_%mangle (struct_type);
184- static void init_info_%mangle (struct_type)() {
185- init_struct_info (info_%mangle (struct_type), $descriptor (struct_type*));
186- };
187178}
188179%fragment(" get_item" {struct_type}, " header" ,
189180 fragment=" struct_info" {struct_type}, fragment=" get_attr_struct" ) {
190181static PyObject* get_item_%mangle (struct_type)(PyObject* obj,
191182 PyObject* key) {
192- init_info_%mangle (struct_type)();
193183 return get_attr_struct (info_%mangle (struct_type), true , obj, key);
194184};
195185}
196186%fragment(" get_attr" {struct_type}, " header" ,
197187 fragment=" struct_info" {struct_type}, fragment=" get_attr_struct" ) {
198188static PyObject* get_attr_%mangle (struct_type)(PyObject* obj,
199189 PyObject* name) {
200- init_info_%mangle (struct_type)();
201190 return get_attr_struct (info_%mangle (struct_type), false , obj, name);
202191};
203192}
204193%fragment(" set_item" {struct_type}, " header" ,
205194 fragment=" struct_info" {struct_type}, fragment=" set_attr_struct" ) {
206195static int set_item_%mangle (struct_type)(
207196 PyObject* obj, PyObject* key, PyObject* value) {
208- init_info_%mangle (struct_type)();
209197 return set_attr_struct (info_%mangle (struct_type), true , obj, key, value);
210198};
211199}
212200%fragment(" set_attr" {struct_type}, " header" ,
213201 fragment=" struct_info" {struct_type}, fragment=" set_attr_struct" ) {
214202static int set_attr_%mangle (struct_type)(
215203 PyObject* obj, PyObject* name, PyObject* value) {
216- init_info_%mangle (struct_type)();
217204 return set_attr_struct (
218205 info_%mangle (struct_type), false , obj, name, value);
219206};
@@ -237,3 +224,20 @@ static int set_attr_%mangle(struct_type)(
237224#endif
238225#endif // mutable
239226%enddef // STRUCT_DICT
227+
228+
229+ // Put this at the end of a .i file, after the struct_type type object
230+ // has been initialised.
231+ %define INIT_STRUCT_DICT (struct_type)
232+ %fragment(" init_struct_dict" {struct_type}, " init" ,
233+ fragment=" struct_info" {struct_type},
234+ fragment=" init_struct_info" ) {
235+ init_struct_info (info_%mangle (struct_type), $descriptor (struct_type*));
236+ if (info_%mangle (struct_type).aliases .empty ()) {
237+ PyErr_SetString (
238+ PyExc_RuntimeError, " Failed to initialise struct_type info" );
239+ return INIT_ERROR_RETURN;
240+ }
241+ }
242+ %fragment(" init_struct_dict" {struct_type});
243+ %enddef // INIT_STRUCT_DICT
0 commit comments