2011/1/27 Stefan Behnel <stefan...@behnel.de>: > Vitja Makarov, 27.01.2011 10:02: >> 2011/1/27 Stefan Behnel: >>> Vitja Makarov, 27.01.2011 08:25: >>>>>> 2011/1/25 Stefan Behnel: >>>>>>> Vitja Makarov, 25.01.2011 10:01: >>>>>>>> 2011/1/25 Stefan Behnel: >>>>>>>>> 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. It's >>>>>>> set to >>>>>>> False by default and to True on all nodes you mentioned above, and is >>>>>>> inherited by StatListNode if its last node is a terminator (while >>>>>>> dropping >>>>>>> its remaining child nodes at the same time) and by all helper nodes that >>>>>>> contain StatListNodes. This could be done in analyse_types() (or maybe >>>>>>> earlier?). >>>> >>>> Ok. I've moved it into ParseTreeTransforms and created branch: >>>> >>>> https://github.com/vitek/cython/commit/a8e957ec29f0448ee7c43bd3969012772d09b236 >>> >>> the StatListNode (and >>> other nodes) should inherit the flag from their last child. >> >> This could be done simply in RemoveUnreachableCode >> >> node.is_terminator = True > > Sure. > > >> 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. Is there a way to write tests for warnings? If no think we should create one. >>>> 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. 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 -- vitja. _______________________________________________ Cython-dev mailing list Cython-dev@codespeak.net http://codespeak.net/mailman/listinfo/cython-dev