[Cython] ComprehensionNode problem
Vitja Makarov
vitja.makarov at gmail.com
Fri Sep 2 08:06:50 CEST 2011
2011/9/2 Robert Bradshaw <robertwb at math.washington.edu>:
> On Sun, Aug 28, 2011 at 1:19 PM, Vitja Makarov <vitja.makarov at gmail.com> wrote:
>> I've started #715 ticket investigation.
>>
>>
>> Here is minimal test case:
>>
>> # cython: language_level=3
>> def foo(target):
>> return [(e for e in t) for t in target]
>>
>> Crash in the ticket is related to GeneratorExpressionScope (name is
>> not correct, actually ScopedExprScope or NestedScope)
>>
>> If you set languange_level to 2 you will see next error:
>> ...
>> Compiler crash traceback from this point on:
>> File "/home/vitja/work/cython-vitek-git/Cython/Compiler/ExprNodes.py",
>> line 7732, in __init__
>> if not result_type.create_from_py_utility_code(env):
>> AttributeError: 'UnspecifiedType' object has no attribute
>> 'create_from_py_utility_code'
>>
>>
>> Since ComprehensionNode.append and ComprehensionNode.loop.body is the
>> same generator body is created twice in MarkClosureVisitor
>>
>> So the issue could be solved in two ways:
>>
>> - Write special handler for ComprehensionNode in MarkClosureVisitor
>> - Remove append child attribute from ComprehensionNode (it can be
>> removed completely or just from children attribute list)
>
> +1 to the latter option (which I see is what you did, thanks).
>
Thanks!
I've also found one interesting bug in genexpr implementation
http://trac.cython.org/cython_trac/ticket/724
In CPython iterator is evaluated before genexpr is created.
class Foo:
def __iter__(self):
print 'iter'
return self
def next(self):
return 1
g = (i for i in Foo())
print g
will print in cpython:
iter
<generator ...>
and in cython:
<generator...>
Don't know how to deal with it now.
--
vitja.
More information about the cython-devel
mailing list