honour wraparound option in object slicing code
authorStefan Behnel <stefan_ml@behnel.de>
Sat, 16 Mar 2013 18:37:42 +0000 (19:37 +0100)
committerStefan Behnel <stefan_ml@behnel.de>
Sat, 16 Mar 2013 18:37:42 +0000 (19:37 +0100)
Cython/Compiler/ExprNodes.py
Cython/Utility/ObjectHandling.c

index 0e871bc..0d111d9 100755 (executable)
@@ -3678,12 +3678,13 @@ class SliceIndexNode(ExprNode):
             (has_c_start, has_c_stop, c_start, c_stop,
              py_start, py_stop, py_slice) = self.get_slice_config()
             code.putln(
-                "%s = __Pyx_PyObject_GetSlice(%s, %s, %s, %s, %s, %s, %d, %d); %s" % (
+                "%s = __Pyx_PyObject_GetSlice(%s, %s, %s, %s, %s, %s, %d, %d, %d); %s" % (
                     result,
                     self.base.py_result(),
                     c_start, c_stop,
                     py_start, py_stop, py_slice,
                     has_c_start, has_c_stop,
+                    bool(code.globalstate.directives['wraparound']),
                     code.error_goto_if_null(result, self.pos)))
         else:
             if self.base.type is list_type:
@@ -3713,12 +3714,13 @@ class SliceIndexNode(ExprNode):
             (has_c_start, has_c_stop, c_start, c_stop,
              py_start, py_stop, py_slice) = self.get_slice_config()
             code.put_error_if_neg(self.pos,
-                "__Pyx_PyObject_SetSlice(%s, %s, %s, %s, %s, %s, %s, %d, %d)" % (
+                "__Pyx_PyObject_SetSlice(%s, %s, %s, %s, %s, %s, %s, %d, %d, %d)" % (
                     self.base.py_result(),
                     rhs.py_result(),
                     c_start, c_stop,
                     py_start, py_stop, py_slice,
-                    has_c_start, has_c_stop))
+                    has_c_start, has_c_stop,
+                    bool(code.globalstate.directives['wraparound'])))
         else:
             start_offset = ''
             if self.start:
@@ -3754,11 +3756,12 @@ class SliceIndexNode(ExprNode):
         (has_c_start, has_c_stop, c_start, c_stop,
          py_start, py_stop, py_slice) = self.get_slice_config()
         code.put_error_if_neg(self.pos,
-            "__Pyx_PyObject_DelSlice(%s, %s, %s, %s, %s, %s, %d, %d)" % (
+            "__Pyx_PyObject_DelSlice(%s, %s, %s, %s, %s, %s, %d, %d, %d)" % (
                 self.base.py_result(),
                 c_start, c_stop,
                 py_start, py_stop, py_slice,
-                has_c_start, has_c_stop))
+                has_c_start, has_c_stop,
+                bool(code.globalstate.directives['wraparound'])))
         self.generate_subexpr_disposal_code(code)
         self.free_subexpr_temps(code)
 
index 2fc0c2d..92e0378 100644 (file)
@@ -451,16 +451,16 @@ static CYTHON_INLINE int __Pyx_DelItemInt_Fast(PyObject *o, Py_ssize_t i,
 static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice(
         PyObject* obj, Py_ssize_t cstart, Py_ssize_t cstop,
         PyObject** py_start, PyObject** py_stop, PyObject** py_slice,
-        int has_cstart, int has_cstop);
+        int has_cstart, int has_cstop, int wraparound);
 {{else}}
-#define __Pyx_PyObject_DelSlice(obj, cstart, cstop, py_start, py_stop, py_slice, has_cstart, has_cstop) \
-    __Pyx_PyObject_SetSlice(obj, (PyObject*)NULL, cstart, cstop, py_start, py_stop, py_slice, has_cstart, has_cstop)
+#define __Pyx_PyObject_DelSlice(obj, cstart, cstop, py_start, py_stop, py_slice, has_cstart, has_cstop, wraparound) \
+    __Pyx_PyObject_SetSlice(obj, (PyObject*)NULL, cstart, cstop, py_start, py_stop, py_slice, has_cstart, has_cstop, wraparound)
 
 // we pass pointer addresses to show the C compiler what is NULL and what isn't
 static CYTHON_INLINE int __Pyx_PyObject_SetSlice(
         PyObject* obj, PyObject* value, Py_ssize_t cstart, Py_ssize_t cstop,
         PyObject** py_start, PyObject** py_stop, PyObject** py_slice,
-        int has_cstart, int has_cstop);
+        int has_cstart, int has_cstop, int wraparound);
 {{endif}}
 
 /////////////// SliceObject ///////////////
@@ -473,7 +473,7 @@ static CYTHON_INLINE int __Pyx_PyObject_SetSlice(
         PyObject* obj, PyObject* value, Py_ssize_t cstart, Py_ssize_t cstop,
 {{endif}}
         PyObject** _py_start, PyObject** _py_stop, PyObject** _py_slice,
-        int has_cstart, int has_cstop) {
+        int has_cstart, int has_cstop, CYTHON_UNUSED int wraparound) {
     PyMappingMethods* mp;
 #if PY_MAJOR_VERSION < 3
     PySequenceMethods* ms = Py_TYPE(obj)->tp_as_sequence;
@@ -492,7 +492,7 @@ static CYTHON_INLINE int __Pyx_PyObject_SetSlice(
             } else
                 cstop = PY_SSIZE_T_MAX;
         }
-        if (unlikely((cstart < 0) | (cstop < 0)) && likely(ms->sq_length)) {
+        if (wraparound && unlikely((cstart < 0) | (cstop < 0)) && likely(ms->sq_length)) {
             Py_ssize_t l = ms->sq_length(obj);
             if (likely(l >= 0)) {
                 if (cstop < 0) {