diff options
Diffstat (limited to 'Python/bytecodes.c')
| -rw-r--r-- | Python/bytecodes.c | 24 |
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; |
