@@ -866,19 +866,30 @@ dummy_func(
866866 }
867867
868868 op (_BINARY_SLICE , (container , start , stop -- res )) {
869- PyObject * slice = _PyBuildSlice_ConsumeRefs (PyStackRef_AsPyObjectSteal (start ),
870- PyStackRef_AsPyObjectSteal (stop ));
869+ PyObject * container_o = PyStackRef_AsPyObjectBorrow (container );
870+ PyObject * start_o = PyStackRef_AsPyObjectBorrow (start );
871+ PyObject * stop_o = PyStackRef_AsPyObjectBorrow (stop );
871872 PyObject * res_o ;
872- // Can't use ERROR_IF() here, because we haven't
873- // DECREF'ed container yet, and we still own slice.
874- if (slice == NULL ) {
875- res_o = NULL ;
873+ if (PyList_CheckExact (container_o )) {
874+ res_o = _PyList_BinarySlice (container_o , start_o , stop_o );
875+ }
876+ else if (PyTuple_CheckExact (container_o )) {
877+ res_o = _PyTuple_BinarySlice (container_o , start_o , stop_o );
878+ }
879+ else if (PyUnicode_CheckExact (container_o )) {
880+ res_o = _PyUnicode_BinarySlice (container_o , start_o , stop_o );
876881 }
877882 else {
878- res_o = PyObject_GetItem (PyStackRef_AsPyObjectBorrow (container ), slice );
879- Py_DECREF (slice );
883+ PyObject * slice = PySlice_New (start_o , stop_o , NULL );
884+ if (slice == NULL ) {
885+ res_o = NULL ;
886+ }
887+ else {
888+ res_o = PyObject_GetItem (container_o , slice );
889+ Py_DECREF (slice );
890+ }
880891 }
881- PyStackRef_CLOSE ( container );
892+ DECREF_INPUTS ( );
882893 ERROR_IF (res_o == NULL );
883894 res = PyStackRef_FromPyObjectSteal (res_o );
884895 }
0 commit comments