@@ -202,20 +202,23 @@ static PyType_Spec nb_type_spec = {
202202
203203static PyType_Slot nb_enum_slots[] = {
204204 { Py_tp_base, nullptr },
205- { Py_tp_traverse, nullptr },
206- { Py_tp_clear, nullptr },
207205 { 0 , nullptr }
208206};
209207
210208static PyType_Spec nb_enum_spec = {
211209 .name = " nanobind.nb_enum" ,
212- .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC ,
210+ .flags = Py_TPFLAGS_DEFAULT,
213211 .slots = nb_enum_slots
214212};
215213
214+ static PyMemberDef nb_static_property_members[] = {
215+ { " __doc__" , T_OBJECT , 0 , 0 , nullptr },
216+ { nullptr , 0 , 0 , 0 , nullptr }
217+ };
218+
216219static PyType_Slot nb_static_property_slots[] = {
217220 { Py_tp_base, nullptr },
218- { Py_tp_members, nullptr },
221+ { Py_tp_members, ( void *) nb_static_property_members },
219222 { Py_tp_descr_get, (void *) nb_static_property_get },
220223 { 0 , nullptr }
221224};
@@ -384,43 +387,52 @@ static void internals_make() {
384387 if (rv || !capsule || !nb_module)
385388 fail (" nanobind::detail::internals_make(): allocation failed!" );
386389 Py_DECREF (capsule);
387- internals_p->nb_module = nb_module;
388390
389- internals_p->type_basicsize =
390- cast<int >(handle (&PyType_Type).attr (" __basicsize__" ));
391-
392- nb_type_spec.basicsize = nb_enum_spec.basicsize =
393- internals_p->type_basicsize + (int ) sizeof (type_data);
394- nb_type_spec.itemsize = nb_enum_spec.itemsize =
395- cast<int >(handle (&PyType_Type).attr (" __itemsize__" ));
391+ internals_p->nb_module = nb_module;
396392
393+ // Function objects
397394 internals_p->nb_func = (PyTypeObject *) PyType_FromSpec (&nb_func_spec);
398395 internals_p->nb_method = (PyTypeObject *) PyType_FromSpec (&nb_method_spec);
399396 internals_p->nb_bound_method =
400397 (PyTypeObject *) PyType_FromSpec (&nb_bound_method_spec);
401398
402- nb_type_slots[0 ].pfunc = &PyType_Type;
403- internals_p->nb_type = (PyTypeObject *) PyType_FromSpec (&nb_type_spec);
404-
405- nb_enum_slots[0 ].pfunc = internals_p->nb_type ;
406- nb_static_property_slots[0 ].pfunc = &PyProperty_Type;
407-
399+ // Metaclass #1 (nb_type)
408400#if defined(Py_LIMITED_API)
409- nb_enum_slots[1 ].pfunc = PyType_GetSlot (&PyType_Type, Py_tp_traverse);
410- nb_enum_slots[2 ].pfunc = PyType_GetSlot (&PyType_Type, Py_tp_clear);
411- nb_static_property_slots[1 ].pfunc = PyType_GetSlot (&PyProperty_Type, Py_tp_members);
401+ int tp_itemsize = cast<int >(handle (&PyType_Type).attr (" __itemsize__" ));
402+ int tp_basicsize = cast<int >(handle (&PyType_Type).attr (" __basicsize__" ));
412403#else
413- nb_enum_slots[1 ].pfunc = (void *) PyType_Type.tp_traverse ;
414- nb_enum_slots[2 ].pfunc = (void *) PyType_Type.tp_clear ;
415- nb_static_property_slots[1 ].pfunc = PyProperty_Type.tp_members ;
404+ int tp_itemsize = (int ) PyType_Type.tp_itemsize ;
405+ int tp_basicsize = (int ) PyType_Type.tp_basicsize ;
416406#endif
407+ nb_type_spec.basicsize = nb_enum_spec.basicsize = tp_basicsize
408+ + (int ) sizeof (type_data);
409+ nb_type_spec.itemsize = nb_enum_spec.itemsize = tp_itemsize;
410+ nb_type_slots[0 ].pfunc = &PyType_Type;
411+ internals_p->nb_type = (PyTypeObject *) PyType_FromSpec (&nb_type_spec);
417412
413+ // Metaclass #2 (nb_enum)
414+ nb_enum_slots[0 ].pfunc = internals_p->nb_type ;
418415 internals_p->nb_enum = (PyTypeObject *) PyType_FromSpec (&nb_enum_spec);
416+
417+ // / Static properties
418+ #if defined(Py_LIMITED_API)
419+ tp_itemsize = cast<int >(handle (&PyProperty_Type).attr (" __itemsize__" ));
420+ tp_basicsize = cast<int >(handle (&PyProperty_Type).attr (" __basicsize__" ));
421+ #else
422+ tp_itemsize = (int ) PyProperty_Type.tp_itemsize ;
423+ tp_basicsize = (int ) PyProperty_Type.tp_basicsize ;
424+ #endif
425+ nb_static_property_spec.basicsize = tp_basicsize + sizeof (PyObject *);
426+ nb_static_property_spec.itemsize = tp_itemsize;
427+ nb_static_property_members[0 ].offset = tp_basicsize;
428+ nb_static_property_slots[0 ].pfunc = &PyProperty_Type;
419429 internals_p->nb_static_property =
420430 (PyTypeObject *) PyType_FromSpec (&nb_static_property_spec);
421431 internals_p->nb_static_property_enabled = true ;
422432
433+ // Tensor type
423434 internals_p->nb_tensor = (PyTypeObject *) PyType_FromSpec (&nb_tensor_spec);
435+
424436 if (!internals_p->nb_func || !internals_p->nb_method ||
425437 !internals_p->nb_bound_method || !internals_p->nb_type ||
426438 !internals_p->nb_enum || !internals_p->nb_static_property ||
0 commit comments