Buffers: Complex number structs work.
authorDag Sverre Seljebotn <dagss@student.matnat.uio.no>
Mon, 29 Sep 2008 16:49:27 +0000 (18:49 +0200)
committerDag Sverre Seljebotn <dagss@student.matnat.uio.no>
Mon, 29 Sep 2008 16:49:27 +0000 (18:49 +0200)
Cython/Compiler/ExprNodes.py
tests/run/bufaccess.pyx
tests/run/numpy_test.pyx

index 2ba795e3e2e19c2400877553d9e3051fbb6f2fa0..6b95c76e7da8526415024f1e99ee140150a4e7ea 100644 (file)
@@ -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 "<not used>"
+            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:
index 9c02c68fbd46784f9dc9236883de0cad60ce14b8..b3a6198599df469b82a130b9ed13f80689f7c112 100644 (file)
@@ -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
index 934e33d4e7e821c2fabf4e6cb1e2607e48094566..e0d22e571407d570d71fbe8a3146bca5c66b26d6 100644 (file)
@@ -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]