@@ -5427,23 +5427,26 @@ int
54275427_PyObject_StoreInstanceAttribute (PyObject * obj , PyDictValues * values ,
54285428 PyObject * name , PyObject * value )
54295429{
5430- assert (PyUnicode_CheckExact (name ));
54315430 PyDictKeysObject * keys = CACHED_KEYS (Py_TYPE (obj ));
54325431 assert (keys != NULL );
54335432 assert (values != NULL );
54345433 assert (Py_TYPE (obj )-> tp_flags & Py_TPFLAGS_MANAGED_DICT );
5435- Py_ssize_t ix = insert_into_dictkeys (keys , name );
5434+ Py_ssize_t ix = DKIX_EMPTY ;
5435+ if (PyUnicode_CheckExact (name )) {
5436+ ix = insert_into_dictkeys (keys , name );
5437+ }
54365438 if (ix == DKIX_EMPTY ) {
5437- if (value == NULL ) {
5438- PyErr_SetObject (PyExc_AttributeError , name );
5439- return -1 ;
5440- }
54415439#ifdef Py_STATS
5442- if (shared_keys_usable_size (keys ) == SHARED_KEYS_MAX_SIZE ) {
5443- OBJECT_STAT_INC (dict_materialized_too_big );
5440+ if (PyUnicode_CheckExact (name )) {
5441+ if (shared_keys_usable_size (keys ) == SHARED_KEYS_MAX_SIZE ) {
5442+ OBJECT_STAT_INC (dict_materialized_too_big );
5443+ }
5444+ else {
5445+ OBJECT_STAT_INC (dict_materialized_new_key );
5446+ }
54445447 }
54455448 else {
5446- OBJECT_STAT_INC (dict_materialized_new_key );
5449+ OBJECT_STAT_INC (dict_materialized_str_subclass );
54475450 }
54485451#endif
54495452 PyObject * dict = make_dict_from_instance_attributes (keys , values );
@@ -5452,7 +5455,12 @@ _PyObject_StoreInstanceAttribute(PyObject *obj, PyDictValues *values,
54525455 }
54535456 * _PyObject_ValuesPointer (obj ) = NULL ;
54545457 * _PyObject_ManagedDictPointer (obj ) = dict ;
5455- return PyDict_SetItem (dict , name , value );
5458+ if (value == NULL ) {
5459+ return PyDict_DelItem (dict , name );
5460+ }
5461+ else {
5462+ return PyDict_SetItem (dict , name , value );
5463+ }
54565464 }
54575465 PyObject * old_value = values -> values [ix ];
54585466 Py_XINCREF (value );
0 commit comments