static PyObject* CAtom_new( PyTypeObject* type, PyObject* args, PyObject* kwargs ) { PyDictPtr membersptr( PyObject_GetAttr( pyobject_cast( type ), atom_members ) ); if( !membersptr ) return 0; if( !membersptr.check_exact() ) return py_bad_internal_call( "atom members" ); PyObjectPtr selfptr( PyType_GenericNew( type, args, kwargs ) ); if( !selfptr ) return 0; CAtom* atom = catom_cast( selfptr.get() ); uint32_t count = static_cast<uint32_t>( membersptr.size() ); if( count > 0 ) { if( count > MAX_MEMBER_COUNT ) return py_type_fail( "too many members" ); size_t size = sizeof( PyObject* ) * count; void* slots = PyObject_MALLOC( size ); if( !slots ) return PyErr_NoMemory(); memset( slots, 0, size ); atom->slots = reinterpret_cast<PyObject**>( slots ); atom->set_slot_count( count ); } atom->set_notifications_enabled( true ); return selfptr.release(); }