diff options
Diffstat (limited to 'Python')
-rw-r--r-- | Python/bytecodes.c | 16 | ||||
-rw-r--r-- | Python/executor_cases.c.h | 20 | ||||
-rw-r--r-- | Python/gc.c | 3 | ||||
-rw-r--r-- | Python/gc_free_threading.c | 3 | ||||
-rw-r--r-- | Python/generated_cases.c.h | 15 | ||||
-rw-r--r-- | Python/optimizer_bytecodes.c | 4 | ||||
-rw-r--r-- | Python/optimizer_cases.c.h | 4 | ||||
-rw-r--r-- | Python/specialize.c | 16 |
8 files changed, 50 insertions, 31 deletions
diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 5adcd77..250e2d1 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 { diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 1db8e50..55b06a0 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -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 { diff --git a/Python/gc.c b/Python/gc.c index 923a792..f920743 100644 --- a/Python/gc.c +++ b/Python/gc.c @@ -2055,6 +2055,9 @@ _PyObject_GC_New(PyTypeObject *tp) return NULL; } _PyObject_Init(op, tp); + if (tp->tp_flags & Py_TPFLAGS_INLINE_VALUES) { + _PyObject_InitInlineValues(op, tp); + } return op; } diff --git a/Python/gc_free_threading.c b/Python/gc_free_threading.c index b954565..54de0c2 100644 --- a/Python/gc_free_threading.c +++ b/Python/gc_free_threading.c @@ -1810,6 +1810,9 @@ _PyObject_GC_New(PyTypeObject *tp) return NULL; } _PyObject_Init(op, tp); + if (tp->tp_flags & Py_TPFLAGS_INLINE_VALUES) { + _PyObject_InitInlineValues(op, tp); + } return op; } diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 42a58bb..13bbff2 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -4999,9 +4999,10 @@ } // _LOAD_ATTR_INSTANCE_VALUE { - uint16_t index = read_u16(&this_instr[4].cache); + uint16_t offset = read_u16(&this_instr[4].cache); 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, LOAD_ATTR); STAT_INC(LOAD_ATTR, hit); Py_INCREF(attr_o); @@ -6829,14 +6830,16 @@ // _STORE_ATTR_INSTANCE_VALUE value = stack_pointer[-2]; { - uint16_t index = read_u16(&this_instr[4].cache); + uint16_t offset = read_u16(&this_instr[4].cache); 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 { diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index 6e46d9b..9a1b9da 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -452,10 +452,10 @@ dummy_func(void) { top, unused[oparg-2], bottom)) { } - op(_LOAD_ATTR_INSTANCE_VALUE, (index/1, owner -- attr, null if (oparg & 1))) { + op(_LOAD_ATTR_INSTANCE_VALUE, (offset/1, owner -- attr, null if (oparg & 1))) { attr = sym_new_not_null(ctx); null = sym_new_null(ctx); - (void)index; + (void)offset; (void)owner; } diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index e5be9d0..672fec3 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -1064,10 +1064,10 @@ _Py_UopsSymbol *attr; _Py_UopsSymbol *null = NULL; owner = stack_pointer[-1]; - uint16_t index = (uint16_t)this_instr->operand; + uint16_t offset = (uint16_t)this_instr->operand; attr = sym_new_not_null(ctx); null = sym_new_null(ctx); - (void)index; + (void)offset; (void)owner; stack_pointer[-1] = attr; if (oparg & 1) stack_pointer[0] = null; diff --git a/Python/specialize.c b/Python/specialize.c index b3a2e07..db794be 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -849,15 +849,19 @@ specialize_dict_access( assert(PyUnicode_CheckExact(name)); Py_ssize_t index = _PyDictKeys_StringLookup(keys, name); assert (index != DKIX_ERROR); - if (index != (uint16_t)index) { - SPECIALIZATION_FAIL(base_op, - index == DKIX_EMPTY ? - SPEC_FAIL_ATTR_NOT_IN_KEYS : - SPEC_FAIL_OUT_OF_RANGE); + if (index == DKIX_EMPTY) { + SPECIALIZATION_FAIL(base_op, SPEC_FAIL_ATTR_NOT_IN_KEYS); + return 0; + } + assert(index >= 0); + char *value_addr = (char *)&_PyObject_InlineValues(owner)->values[index]; + Py_ssize_t offset = value_addr - (char *)owner; + if (offset != (uint16_t)offset) { + SPECIALIZATION_FAIL(base_op, SPEC_FAIL_OUT_OF_RANGE); return 0; } write_u32(cache->version, type->tp_version_tag); - cache->index = (uint16_t)index; + cache->index = (uint16_t)offset; instr->op.code = values_op; } else { |