summaryrefslogtreecommitdiff
path: root/Cython/Compiler/MemoryView.py
diff options
context:
space:
mode:
authorMark Florisson <markflorisson88@gmail.com>2012-01-22 12:19:20 +0000
committerMark Florisson <markflorisson88@gmail.com>2012-01-22 19:04:21 +0000
commit06c0c96ba1c86adc14872bffe414600b086efe83 (patch)
tree44487db564cd3835d7ca27ea5fc665f85722ca8d /Cython/Compiler/MemoryView.py
parentf5134ba81621ff6824664eeacaaf47ad60ae712f (diff)
downloadcython-06c0c96ba1c86adc14872bffe414600b086efe83.tar.gz
Fix segfault caused by NULL suboffsets
Diffstat (limited to 'Cython/Compiler/MemoryView.py')
-rw-r--r--Cython/Compiler/MemoryView.py24
1 files changed, 14 insertions, 10 deletions
diff --git a/Cython/Compiler/MemoryView.py b/Cython/Compiler/MemoryView.py
index bb6e54f46..561110d22 100644
--- a/Cython/Compiler/MemoryView.py
+++ b/Cython/Compiler/MemoryView.py
@@ -471,15 +471,19 @@ def assign_scalar(dst, scalar, code):
code.putln("%s __pyx_temp_slice = %s;" % (slice_decl, dst.result()))
dst_temp = "__pyx_temp_slice"
- with slice_iter(dst.type, dst_temp, dst.type.ndim, code) as p:
- if dtype.is_pyobject:
- code.putln("Py_DECREF((PyObject *) %s);" % p)
+ # with slice_iter(dst.type, dst_temp, dst.type.ndim, code) as p:
+ slice_iter_obj = slice_iter(dst.type, dst_temp, dst.type.ndim, code)
+ p = slice_iter_obj.start_loops()
- code.putln("*((%s *) %s) = __pyx_temp_scalar;" % (type_decl, p))
+ if dtype.is_pyobject:
+ code.putln("Py_DECREF((PyObject *) %s);" % p)
- if dtype.is_pyobject:
- code.putln("Py_INCREF(__pyx_temp_scalar);")
+ code.putln("*((%s *) %s) = __pyx_temp_scalar;" % (type_decl, p))
+ if dtype.is_pyobject:
+ code.putln("Py_INCREF(__pyx_temp_scalar);")
+
+ slice_iter_obj.end_loops()
code.end_block()
def slice_iter(slice_type, slice_temp, ndim, code):
@@ -496,7 +500,7 @@ class SliceIter(object):
self.ndim = ndim
class ContigSliceIter(SliceIter):
- def __enter__(self):
+ def start_loops(self):
code = self.code
code.begin_block()
@@ -514,13 +518,13 @@ class ContigSliceIter(SliceIter):
return "__pyx_temp_pointer"
- def __exit__(self, *args):
+ def end_loops(self):
self.code.putln("__pyx_temp_pointer += 1;")
self.code.putln("}")
self.code.end_block()
class StridedSliceIter(SliceIter):
- def __enter__(self):
+ def start_loops(self):
code = self.code
code.begin_block()
@@ -543,7 +547,7 @@ class StridedSliceIter(SliceIter):
return "__pyx_temp_pointer_%d" % (self.ndim - 1)
- def __exit__(self, *args):
+ def end_loops(self):
code = self.code
for i in range(self.ndim - 1, -1, -1):
code.putln("__pyx_temp_pointer_%d += __pyx_temp_stride_%d;" % (i, i))