GH-115776: Allow any fixed sized object to have inline values (GH-123192)
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user