From a4fd7aa4a6420cef1c22ec64eab54d8aea41cc57 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Wed, 21 Aug 2024 15:52:04 +0100 Subject: GH-115776: Allow any fixed sized object to have inline values (GH-123192) --- Python/bytecodes.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'Python/bytecodes.c') diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 5adcd77b4d5..250e2d12a9d 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -2012,9 +2012,10 @@ dummy_func( DEOPT_IF(!_PyObject_InlineValues(owner_o)->valid); } - split op(_LOAD_ATTR_INSTANCE_VALUE, (index/1, owner -- attr, null if (oparg & 1))) { + split op(_LOAD_ATTR_INSTANCE_VALUE, (offset/1, owner -- attr, null if (oparg & 1))) { PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner); - PyObject *attr_o = _PyObject_InlineValues(owner_o)->values[index]; + PyObject **value_ptr = (PyObject**)(((char *)owner_o) + offset); + PyObject *attr_o = *value_ptr; DEOPT_IF(attr_o == NULL); STAT_INC(LOAD_ATTR, hit); Py_INCREF(attr_o); @@ -2196,16 +2197,17 @@ dummy_func( EXIT_IF(_PyObject_InlineValues(owner_o)->valid == 0); } - op(_STORE_ATTR_INSTANCE_VALUE, (index/1, value, owner --)) { + op(_STORE_ATTR_INSTANCE_VALUE, (offset/1, value, owner --)) { PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner); STAT_INC(STORE_ATTR, hit); assert(_PyObject_GetManagedDict(owner_o) == NULL); - PyDictValues *values = _PyObject_InlineValues(owner_o); - - PyObject *old_value = values->values[index]; - values->values[index] = PyStackRef_AsPyObjectSteal(value); + PyObject **value_ptr = (PyObject**)(((char *)owner_o) + offset); + PyObject *old_value = *value_ptr; + *value_ptr = PyStackRef_AsPyObjectSteal(value); if (old_value == NULL) { + PyDictValues *values = _PyObject_InlineValues(owner_o); + int index = value_ptr - values->values; _PyDictValues_AddToInsertionOrder(values, index); } else { -- cgit v1.2.3