mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
GH-115776: Allow any fixed sized object to have inline values (GH-123192)
This commit is contained in:
parent
4b7c4880a0
commit
a4fd7aa4a6
13 changed files with 61 additions and 38 deletions
20
Python/executor_cases.c.h
generated
20
Python/executor_cases.c.h
generated
|
@ -2277,9 +2277,10 @@
|
|||
_PyStackRef null = PyStackRef_NULL;
|
||||
(void)null;
|
||||
owner = stack_pointer[-1];
|
||||
uint16_t index = (uint16_t)CURRENT_OPERAND();
|
||||
uint16_t offset = (uint16_t)CURRENT_OPERAND();
|
||||
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;
|
||||
if (attr_o == NULL) {
|
||||
UOP_STAT_INC(uopcode, miss);
|
||||
JUMP_TO_JUMP_TARGET();
|
||||
|
@ -2299,9 +2300,10 @@
|
|||
_PyStackRef null = PyStackRef_NULL;
|
||||
(void)null;
|
||||
owner = stack_pointer[-1];
|
||||
uint16_t index = (uint16_t)CURRENT_OPERAND();
|
||||
uint16_t offset = (uint16_t)CURRENT_OPERAND();
|
||||
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;
|
||||
if (attr_o == NULL) {
|
||||
UOP_STAT_INC(uopcode, miss);
|
||||
JUMP_TO_JUMP_TARGET();
|
||||
|
@ -2583,14 +2585,16 @@
|
|||
_PyStackRef value;
|
||||
owner = stack_pointer[-1];
|
||||
value = stack_pointer[-2];
|
||||
uint16_t index = (uint16_t)CURRENT_OPERAND();
|
||||
uint16_t offset = (uint16_t)CURRENT_OPERAND();
|
||||
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 {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue