From: Dag Sverre Seljebotn Date: Mon, 29 Sep 2008 16:49:27 +0000 (+0200) Subject: Buffers: Complex number structs work. X-Git-Tag: 0.9.9.2.beta~63^2~5 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=aed824f279f9fae8110d59bb05576c256d502e0a;p=cython.git Buffers: Complex number structs work. --- diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index 2ba795e3..6b95c76e 100644 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -1472,12 +1472,9 @@ class IndexNode(ExprNode): self.type = self.base.type.dtype self.is_buffer_access = True self.buffer_type = self.base.entry.type - - if getting: - # we only need a temp because result_code isn't refactored to - # generation time, but this seems an ok shortcut to take + + if getting and self.type.is_pyobject: self.is_temp = True - self.result_ctype = PyrexTypes.c_ptr_type(self.type) if setting: if not self.base.entry.type.writable: error(self.pos, "Writing to readonly buffer") @@ -1528,7 +1525,7 @@ class IndexNode(ExprNode): def calculate_result_code(self): if self.is_buffer_access: - return "" + return "(*%s)" % self.buffer_ptr_code else: return "(%s[%s])" % ( self.base.result(), self.index.result()) @@ -1562,12 +1559,10 @@ class IndexNode(ExprNode): if self.is_buffer_access: if code.globalstate.directives['nonecheck']: self.put_nonecheck(code) - ptrcode = self.buffer_lookup_code(code) - code.putln("%s = *%s;" % ( - self.result(), - self.buffer_type.buffer_ptr_type.cast_code(ptrcode))) - # Must incref the value we pulled out. - if self.buffer_type.dtype.is_pyobject: + self.buffer_ptr_code = self.buffer_lookup_code(code) + if self.type.is_pyobject: + # is_temp is True, so must pull out value and incref it. + code.putln("%s = *%s;" % (self.result(), self.buffer_ptr_code)) code.putln("Py_INCREF((PyObject*)%s);" % self.result()) elif self.type.is_pyobject: if self.index.type.is_int: diff --git a/tests/run/bufaccess.pyx b/tests/run/bufaccess.pyx index 9c02c68f..b3a61985 100644 --- a/tests/run/bufaccess.pyx +++ b/tests/run/bufaccess.pyx @@ -24,8 +24,14 @@ setup_string = u""" >>> E = ErrorBuffer("E") """ + +import re +exclude = []#re.compile('object').search] def testcase(func): + for e in exclude: + if e(func.__name__): + return func __test__[func.__name__] = setup_string + func.__doc__ return func @@ -1326,7 +1332,7 @@ def complex_struct_dtype(object[LongComplex] buf): @testcase def complex_struct_inplace(object[LongComplex] buf): """ - >>> complex_struct_dtype(LongComplexMockBuffer(None, [(0, -1)])) + >>> complex_struct_inplace(LongComplexMockBuffer(None, [(0, -1)])) 1.0 1.0 """ buf[0].real += 1 diff --git a/tests/run/numpy_test.pyx b/tests/run/numpy_test.pyx index 934e33d4..e0d22e57 100644 --- a/tests/run/numpy_test.pyx +++ b/tests/run/numpy_test.pyx @@ -229,14 +229,10 @@ def inc1_cdouble(np.ndarray[cdouble] arr): arr[1].imag += 1 def inc1_clongdouble(np.ndarray[clongdouble] arr): - print arr[1].real - print arr[1].imag cdef long double x x = arr[1].real + 1 arr[1].real = x arr[1].imag = arr[1].imag + 1 - print arr[1].real - print arr[1].imag def inc1_object(np.ndarray[object] arr): o = arr[1]