diff options
author | Mark Florisson <markflorisson88@gmail.com> | 2012-01-22 12:19:20 +0000 |
---|---|---|
committer | Mark Florisson <markflorisson88@gmail.com> | 2012-01-22 19:04:21 +0000 |
commit | 06c0c96ba1c86adc14872bffe414600b086efe83 (patch) | |
tree | 44487db564cd3835d7ca27ea5fc665f85722ca8d /Cython/Compiler/MemoryView.py | |
parent | f5134ba81621ff6824664eeacaaf47ad60ae712f (diff) | |
download | cython-06c0c96ba1c86adc14872bffe414600b086efe83.tar.gz |
Fix segfault caused by NULL suboffsets
Diffstat (limited to 'Cython/Compiler/MemoryView.py')
-rw-r--r-- | Cython/Compiler/MemoryView.py | 24 |
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)) |