Commit aed824f2 authored by Dag Sverre Seljebotn's avatar Dag Sverre Seljebotn

Buffers: Complex number structs work.

parent c587c449
...@@ -1473,11 +1473,8 @@ class IndexNode(ExprNode): ...@@ -1473,11 +1473,8 @@ class IndexNode(ExprNode):
self.is_buffer_access = True self.is_buffer_access = True
self.buffer_type = self.base.entry.type self.buffer_type = self.base.entry.type
if getting: if getting and self.type.is_pyobject:
# we only need a temp because result_code isn't refactored to
# generation time, but this seems an ok shortcut to take
self.is_temp = True self.is_temp = True
self.result_ctype = PyrexTypes.c_ptr_type(self.type)
if setting: if setting:
if not self.base.entry.type.writable: if not self.base.entry.type.writable:
error(self.pos, "Writing to readonly buffer") error(self.pos, "Writing to readonly buffer")
...@@ -1528,7 +1525,7 @@ class IndexNode(ExprNode): ...@@ -1528,7 +1525,7 @@ class IndexNode(ExprNode):
def calculate_result_code(self): def calculate_result_code(self):
if self.is_buffer_access: if self.is_buffer_access:
return "<not used>" return "(*%s)" % self.buffer_ptr_code
else: else:
return "(%s[%s])" % ( return "(%s[%s])" % (
self.base.result(), self.index.result()) self.base.result(), self.index.result())
...@@ -1562,12 +1559,10 @@ class IndexNode(ExprNode): ...@@ -1562,12 +1559,10 @@ class IndexNode(ExprNode):
if self.is_buffer_access: if self.is_buffer_access:
if code.globalstate.directives['nonecheck']: if code.globalstate.directives['nonecheck']:
self.put_nonecheck(code) self.put_nonecheck(code)
ptrcode = self.buffer_lookup_code(code) self.buffer_ptr_code = self.buffer_lookup_code(code)
code.putln("%s = *%s;" % ( if self.type.is_pyobject:
self.result(), # is_temp is True, so must pull out value and incref it.
self.buffer_type.buffer_ptr_type.cast_code(ptrcode))) code.putln("%s = *%s;" % (self.result(), self.buffer_ptr_code))
# Must incref the value we pulled out.
if self.buffer_type.dtype.is_pyobject:
code.putln("Py_INCREF((PyObject*)%s);" % self.result()) code.putln("Py_INCREF((PyObject*)%s);" % self.result())
elif self.type.is_pyobject: elif self.type.is_pyobject:
if self.index.type.is_int: if self.index.type.is_int:
......
...@@ -25,7 +25,13 @@ setup_string = u""" ...@@ -25,7 +25,13 @@ setup_string = u"""
""" """
import re
exclude = []#re.compile('object').search]
def testcase(func): def testcase(func):
for e in exclude:
if e(func.__name__):
return func
__test__[func.__name__] = setup_string + func.__doc__ __test__[func.__name__] = setup_string + func.__doc__
return func return func
...@@ -1326,7 +1332,7 @@ def complex_struct_dtype(object[LongComplex] buf): ...@@ -1326,7 +1332,7 @@ def complex_struct_dtype(object[LongComplex] buf):
@testcase @testcase
def complex_struct_inplace(object[LongComplex] buf): 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 1.0 1.0
""" """
buf[0].real += 1 buf[0].real += 1
......
...@@ -229,14 +229,10 @@ def inc1_cdouble(np.ndarray[cdouble] arr): ...@@ -229,14 +229,10 @@ def inc1_cdouble(np.ndarray[cdouble] arr):
arr[1].imag += 1 arr[1].imag += 1
def inc1_clongdouble(np.ndarray[clongdouble] arr): def inc1_clongdouble(np.ndarray[clongdouble] arr):
print arr[1].real
print arr[1].imag
cdef long double x cdef long double x
x = arr[1].real + 1 x = arr[1].real + 1
arr[1].real = x arr[1].real = x
arr[1].imag = arr[1].imag + 1 arr[1].imag = arr[1].imag + 1
print arr[1].real
print arr[1].imag
def inc1_object(np.ndarray[object] arr): def inc1_object(np.ndarray[object] arr):
o = arr[1] o = arr[1]
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment