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

Assignments on cdef variables are transformed into singleassignments

parent e4792365
...@@ -388,13 +388,9 @@ class CNameDeclaratorNode(CDeclaratorNode): ...@@ -388,13 +388,9 @@ class CNameDeclaratorNode(CDeclaratorNode):
self.default.release_temp(env) self.default.release_temp(env)
def generate_execution_code(self, code): def generate_execution_code(self, code):
if self.default is not None: assert self.default is None
self.default.generate_evaluation_code(code) # PostParse creates assignment statements for any
if self.type.is_pyobject: # default values
self.default.make_owned_reference(code)
code.putln('%s = %s;' % (self.entry.cname, self.default.result_as(self.entry.type)))
self.default.generate_post_assignment_code(code)
code.putln()
class CPtrDeclaratorNode(CDeclaratorNode): class CPtrDeclaratorNode(CDeclaratorNode):
# base CDeclaratorNode # base CDeclaratorNode
......
...@@ -91,6 +91,8 @@ class PostParse(CythonTransform): ...@@ -91,6 +91,8 @@ class PostParse(CythonTransform):
as such). as such).
Specifically: Specifically:
- Default values to cdef assignments are turned into single
assignments following the declaration.
- CBufferAccessTypeNode has its options interpreted: - CBufferAccessTypeNode has its options interpreted:
Any first positional argument goes into the "dtype" attribute, Any first positional argument goes into the "dtype" attribute,
any "ndim" keyword argument goes into the "ndim" attribute and any "ndim" keyword argument goes into the "ndim" attribute and
...@@ -101,6 +103,23 @@ class PostParse(CythonTransform): ...@@ -101,6 +103,23 @@ class PostParse(CythonTransform):
if a more pure Abstract Syntax Tree is wanted. if a more pure Abstract Syntax Tree is wanted.
""" """
def visit_CVarDefNode(self, node):
# This assumes only plain names and pointers are assignable on
# declaration.
self.visitchildren(node)
stats = [node]
for decl in node.declarators:
while isinstance(decl, CPtrDeclaratorNode):
decl = decl.base
if isinstance(decl, CNameDeclaratorNode):
if decl.default is not None:
stats.append(SingleAssignmentNode(node.pos,
lhs=NameNode(node.pos, name=decl.name),
rhs=decl.default))
decl.default = None
return stats
buffer_options = ("dtype", "ndim") # ordered! buffer_options = ("dtype", "ndim") # ordered!
def visit_CBufferAccessTypeNode(self, node): def visit_CBufferAccessTypeNode(self, node):
options = {} options = {}
...@@ -263,7 +282,7 @@ class AnalyseExpressionsTransform(CythonTransform): ...@@ -263,7 +282,7 @@ class AnalyseExpressionsTransform(CythonTransform):
node.body.analyse_expressions(node.local_scope) node.body.analyse_expressions(node.local_scope)
self.visitchildren(node) self.visitchildren(node)
return node return node
class MarkClosureVisitor(CythonTransform): class MarkClosureVisitor(CythonTransform):
needs_closure = False needs_closure = False
......
...@@ -34,6 +34,12 @@ __doc__ = u""" ...@@ -34,6 +34,12 @@ __doc__ = u"""
acquired acquired
0 1 2 3 4 5 0 1 2 3 4 5
released released
>>> cdef_assignment(A, 6)
acquired A
0 1 2 3 4 5
released A
>>> printbuf_float(MockBuffer("f", [1.0, 1.25, 0.75, 1.0]), (4,)) >>> printbuf_float(MockBuffer("f", [1.0, 1.25, 0.75, 1.0]), (4,))
acquired acquired
1.0 1.25 0.75 1.0 1.0 1.25 0.75 1.0
...@@ -86,11 +92,13 @@ def as_argument_defval(object[int] bufarg=MockBuffer('i', range(6)), int n=6): ...@@ -86,11 +92,13 @@ def as_argument_defval(object[int] bufarg=MockBuffer('i', range(6)), int n=6):
print bufarg[i], print bufarg[i],
print print
def cdef_assignment(obj, n):
cdef object[int] buf = obj
cdef int i
for i in range(n):
print buf[i],
print
# default values
#
def printbuf_float(o, shape): def printbuf_float(o, shape):
# should make shape builtin # should make shape builtin
cdef object[float] buf cdef object[float] buf
......
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