summaryrefslogtreecommitdiffstats
path: root/Python/bytecodes.c
diff options
context:
space:
mode:
Diffstat (limited to 'Python/bytecodes.c')
-rw-r--r--Python/bytecodes.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index 496a53d..9ddc3f3 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -519,6 +519,11 @@ dummy_func(
EXIT_IF(!PyList_CheckExact(o));
}
+ op(_GUARD_TOS_SLICE, (tos -- tos)) {
+ PyObject *o = PyStackRef_AsPyObjectBorrow(tos);
+ EXIT_IF(!PySlice_Check(o));
+ }
+
macro(TO_BOOL_LIST) = _GUARD_TOS_LIST + unused/1 + unused/2 + _TO_BOOL_LIST;
op(_TO_BOOL_LIST, (value -- res)) {
@@ -591,6 +596,7 @@ dummy_func(
BINARY_OP_SUBTRACT_FLOAT,
BINARY_OP_ADD_UNICODE,
BINARY_OP_SUBSCR_LIST_INT,
+ BINARY_OP_SUBSCR_LIST_SLICE,
BINARY_OP_SUBSCR_TUPLE_INT,
BINARY_OP_SUBSCR_STR_INT,
BINARY_OP_SUBSCR_DICT,
@@ -900,6 +906,24 @@ dummy_func(
DECREF_INPUTS();
}
+ macro(BINARY_OP_SUBSCR_LIST_SLICE) =
+ _GUARD_TOS_SLICE + _GUARD_NOS_LIST + unused/5 + _BINARY_OP_SUBSCR_LIST_SLICE;
+
+ op(_BINARY_OP_SUBSCR_LIST_SLICE, (list_st, sub_st -- res)) {
+ PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
+ PyObject *list = PyStackRef_AsPyObjectBorrow(list_st);
+
+ assert(PySlice_Check(sub));
+ assert(PyList_CheckExact(list));
+
+ PyObject *res_o = _PyList_SliceSubscript(list, sub);
+ DEOPT_IF(res_o == NULL);
+ STAT_INC(BINARY_OP, hit);
+ res = PyStackRef_FromPyObjectSteal(res_o);
+ STAT_INC(BINARY_OP, hit);
+ DECREF_INPUTS();
+ }
+
macro(BINARY_OP_SUBSCR_STR_INT) =
_GUARD_TOS_INT + _GUARD_NOS_UNICODE + unused/5 + _BINARY_OP_SUBSCR_STR_INT;