Vitja Makarov, 27.01.2011 10:49:
>>>>>>>>>>         def x():
>>>>>>>>>>             do_some_stuff()
>>>>>>>>>>
>>>>>>>>>>             return # disable rest of code, e.g. during debugging
>>>>>>>>>>
>>>>>>>>>>             unreachable_code()
>>>>>>>>>>
>>>>>>>>>> Cython shouldn't bother generating dead code here (even if the C 
>>>>>>>>>> compiler
>>>>>>>>>> would drop it anyway).
>>>>>>>>>
>>>>>>>>> That should be rather easy to do: remove all the nodes in StatList
>>>>>>>>> after: break, continue, return, raise, something else?
>>>>>>>>
>>>>>>>> Careful, this may involve recursive propagation through helper nodes. 
>>>>>>>> The
>>>>>>>> tree isn't always as simple as that.
>>>>>>>>
>>>>>>>> I think an attribute "is_terminator" on Nodes might do the job.
>>>> the StatListNode (and
>>>> other nodes) should inherit the flag from their last child.
>>
>>> I don't actually understand where could be that used later?
>>
>> Well, if you recursively propagate the flag through nodes that support it,
>> you may end up in another StatListNode that strip its trailing dead code.
>> Look through UtilNodes.py, there are a couple of nodes that can wrap
>> Stat(List)Nodes. Maybe check Nodes.py also, not sure if there aren't any
>> other nodes that can safely assume that a terminator at the end of their
>> last child makes them a terminator as well.
>
> return and loop-controls are very different here
>
> if cond:
>     return 1
> else:
>     return 0
> # dead code follows
>
> We can set is_terminator here if all the clauses are terminators
>
> for i in a:
>      if i>  0:
>           continue
>      else
>           break
>      # dead code here
>
> for i in a:
>     return
> # not dead
>
> for i in a:
>      return
> else:
>      return
> # dead
>
> It seems to me that each case should be handled its own way.
> We can't simply say: this node have child with is_terminator set so
> it's terminator too.

That's what I meant, yes. You may also consider making is_terminator a 
method instead of a simple attribute. That would allow nodes to reimplement 
it (even recursively) and make decisions based on their context.


> Is there a way to write tests for warnings? If no think we should create one.

Not yet, it wasn't really a high priority back when I wrote the error test 
support.


>>>>> Some error tests do fail because nodes are removed and code generation
>>>>> time error is omited.
>>>>
>>>> That should be fixable in most cases. We could also use a compiler option
>>>> that disables dead code removal, and then use it in the error tests.
>>>
>>> Hmm, not sure here.
>>> I think it should be better to move checks outside code generation.
>>
>> Ah, ok, I misunderstood you then. Yes, errors should no longer occur at
>> code generation time.
>
> Think that's whole lot of work.

Steps in that direction have been taken several times already. Hopefully, 
they will eventually converge to the expected state.


> When implementing generators I've moved error checking into 
> ParseTreeTransforms
> and left 'yield not supported' in YieldExprNode. That could be later
> replaced with: raise InternalError

Hmm? YieldExprNode is used and generates code, doesn't it? Or did you mean 
to raise InternalError on errors that should have been caught before? I 
don't think there's a need to retest inside of the node. If someone 
disables that transform, I'm fine with seeing Cython crash.

Stefan
_______________________________________________
Cython-dev mailing list
Cython-dev@codespeak.net
http://codespeak.net/mailman/listinfo/cython-dev

Reply via email to