mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
GH-123232: Factor BINARY_SLICE and STORE_SLICE to handle stats properly for tier 2. (GH-123381)
This commit is contained in:
parent
89328f7b12
commit
54a05a4600
4 changed files with 229 additions and 197 deletions
|
@ -668,11 +668,17 @@ dummy_func(
|
|||
|
||||
macro(BINARY_SUBSCR) = _SPECIALIZE_BINARY_SUBSCR + _BINARY_SUBSCR;
|
||||
|
||||
inst(BINARY_SLICE, (container, start, stop -- res)) {
|
||||
specializing op(_SPECIALIZE_BINARY_SLICE, (container, start, stop -- container, start, stop)) {
|
||||
// Placeholder until we implement BINARY_SLICE specialization
|
||||
#if ENABLE_SPECIALIZATION
|
||||
OPCODE_DEFERRED_INC(BINARY_SLICE);
|
||||
#endif /* ENABLE_SPECIALIZATION */
|
||||
}
|
||||
|
||||
op(_BINARY_SLICE, (container, start, stop -- res)) {
|
||||
PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start),
|
||||
PyStackRef_AsPyObjectSteal(stop));
|
||||
PyObject *res_o;
|
||||
OPCODE_DEFERRED_INC(BINARY_SLICE);
|
||||
// Can't use ERROR_IF() here, because we haven't
|
||||
// DECREF'ed container yet, and we still own slice.
|
||||
if (slice == NULL) {
|
||||
|
@ -687,10 +693,18 @@ dummy_func(
|
|||
res = PyStackRef_FromPyObjectSteal(res_o);
|
||||
}
|
||||
|
||||
inst(STORE_SLICE, (v, container, start, stop -- )) {
|
||||
macro(BINARY_SLICE) = _SPECIALIZE_BINARY_SLICE + _BINARY_SLICE;
|
||||
|
||||
specializing op(_SPECIALIZE_STORE_SLICE, (v, container, start, stop -- v, container, start, stop)) {
|
||||
// Placeholder until we implement STORE_SLICE specialization
|
||||
#if ENABLE_SPECIALIZATION
|
||||
OPCODE_DEFERRED_INC(STORE_SLICE);
|
||||
#endif /* ENABLE_SPECIALIZATION */
|
||||
}
|
||||
|
||||
op(_STORE_SLICE, (v, container, start, stop -- )) {
|
||||
PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start),
|
||||
PyStackRef_AsPyObjectSteal(stop));
|
||||
OPCODE_DEFERRED_INC(STORE_SLICE);
|
||||
int err;
|
||||
if (slice == NULL) {
|
||||
err = 1;
|
||||
|
@ -704,6 +718,8 @@ dummy_func(
|
|||
ERROR_IF(err, error);
|
||||
}
|
||||
|
||||
macro(STORE_SLICE) = _SPECIALIZE_STORE_SLICE + _STORE_SLICE;
|
||||
|
||||
inst(BINARY_SUBSCR_LIST_INT, (unused/1, list_st, sub_st -- res)) {
|
||||
PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
|
||||
PyObject *list = PyStackRef_AsPyObjectBorrow(list_st);
|
||||
|
|
2
Python/executor_cases.c.h
generated
2
Python/executor_cases.c.h
generated
|
@ -797,7 +797,6 @@
|
|||
PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start),
|
||||
PyStackRef_AsPyObjectSteal(stop));
|
||||
PyObject *res_o;
|
||||
OPCODE_DEFERRED_INC(BINARY_SLICE);
|
||||
// Can't use ERROR_IF() here, because we haven't
|
||||
// DECREF'ed container yet, and we still own slice.
|
||||
if (slice == NULL) {
|
||||
|
@ -827,7 +826,6 @@
|
|||
v = stack_pointer[-4];
|
||||
PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start),
|
||||
PyStackRef_AsPyObjectSteal(stop));
|
||||
OPCODE_DEFERRED_INC(STORE_SLICE);
|
||||
int err;
|
||||
if (slice == NULL) {
|
||||
err = 1;
|
||||
|
|
74
Python/generated_cases.c.h
generated
74
Python/generated_cases.c.h
generated
|
@ -371,25 +371,34 @@
|
|||
_PyStackRef start;
|
||||
_PyStackRef stop;
|
||||
_PyStackRef res;
|
||||
// _SPECIALIZE_BINARY_SLICE
|
||||
{
|
||||
// Placeholder until we implement BINARY_SLICE specialization
|
||||
#if ENABLE_SPECIALIZATION
|
||||
OPCODE_DEFERRED_INC(BINARY_SLICE);
|
||||
#endif /* ENABLE_SPECIALIZATION */
|
||||
}
|
||||
// _BINARY_SLICE
|
||||
stop = stack_pointer[-1];
|
||||
start = stack_pointer[-2];
|
||||
container = stack_pointer[-3];
|
||||
PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start),
|
||||
PyStackRef_AsPyObjectSteal(stop));
|
||||
PyObject *res_o;
|
||||
OPCODE_DEFERRED_INC(BINARY_SLICE);
|
||||
// Can't use ERROR_IF() here, because we haven't
|
||||
// DECREF'ed container yet, and we still own slice.
|
||||
if (slice == NULL) {
|
||||
res_o = NULL;
|
||||
{
|
||||
PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start),
|
||||
PyStackRef_AsPyObjectSteal(stop));
|
||||
PyObject *res_o;
|
||||
// Can't use ERROR_IF() here, because we haven't
|
||||
// DECREF'ed container yet, and we still own slice.
|
||||
if (slice == NULL) {
|
||||
res_o = NULL;
|
||||
}
|
||||
else {
|
||||
res_o = PyObject_GetItem(PyStackRef_AsPyObjectBorrow(container), slice);
|
||||
Py_DECREF(slice);
|
||||
}
|
||||
PyStackRef_CLOSE(container);
|
||||
if (res_o == NULL) goto pop_3_error;
|
||||
res = PyStackRef_FromPyObjectSteal(res_o);
|
||||
}
|
||||
else {
|
||||
res_o = PyObject_GetItem(PyStackRef_AsPyObjectBorrow(container), slice);
|
||||
Py_DECREF(slice);
|
||||
}
|
||||
PyStackRef_CLOSE(container);
|
||||
if (res_o == NULL) goto pop_3_error;
|
||||
res = PyStackRef_FromPyObjectSteal(res_o);
|
||||
stack_pointer[-3] = res;
|
||||
stack_pointer += -2;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
|
@ -7085,24 +7094,33 @@
|
|||
_PyStackRef container;
|
||||
_PyStackRef start;
|
||||
_PyStackRef stop;
|
||||
// _SPECIALIZE_STORE_SLICE
|
||||
{
|
||||
// Placeholder until we implement STORE_SLICE specialization
|
||||
#if ENABLE_SPECIALIZATION
|
||||
OPCODE_DEFERRED_INC(STORE_SLICE);
|
||||
#endif /* ENABLE_SPECIALIZATION */
|
||||
}
|
||||
// _STORE_SLICE
|
||||
stop = stack_pointer[-1];
|
||||
start = stack_pointer[-2];
|
||||
container = stack_pointer[-3];
|
||||
v = stack_pointer[-4];
|
||||
PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start),
|
||||
PyStackRef_AsPyObjectSteal(stop));
|
||||
OPCODE_DEFERRED_INC(STORE_SLICE);
|
||||
int err;
|
||||
if (slice == NULL) {
|
||||
err = 1;
|
||||
{
|
||||
PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start),
|
||||
PyStackRef_AsPyObjectSteal(stop));
|
||||
int err;
|
||||
if (slice == NULL) {
|
||||
err = 1;
|
||||
}
|
||||
else {
|
||||
err = PyObject_SetItem(PyStackRef_AsPyObjectBorrow(container), slice, PyStackRef_AsPyObjectBorrow(v));
|
||||
Py_DECREF(slice);
|
||||
}
|
||||
PyStackRef_CLOSE(v);
|
||||
PyStackRef_CLOSE(container);
|
||||
if (err) goto pop_4_error;
|
||||
}
|
||||
else {
|
||||
err = PyObject_SetItem(PyStackRef_AsPyObjectBorrow(container), slice, PyStackRef_AsPyObjectBorrow(v));
|
||||
Py_DECREF(slice);
|
||||
}
|
||||
PyStackRef_CLOSE(v);
|
||||
PyStackRef_CLOSE(container);
|
||||
if (err) goto pop_4_error;
|
||||
stack_pointer += -4;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
DISPATCH();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue