[LLVMdev] Patch for llvm::DepthFirstIterator.h and llvm::PostOrderIterator.h

Olaf Krzikalla Olaf.Krzikalla at tu-dresden.de
Fri Jun 26 05:32:44 PDT 2009

Hi @clang and @llvm,

attached you'll find a patch dealing with some iterator issues I already 
mentioned in both lists. Since there was no reaction I cross-post again 
- now IMHO production-ready code.
The patch is considered to get checked-in out of the box. It should not 
affect the behavior of existing and working code. I really need it for 
clang AST processing.

1. Both iterators now can deal with sub-nodes==0 - they just skip them 
silently. For AST processing this is badly needed as you sometimes have 
0-nodes in the AST (e.g. in 'for(;;) {}'). Until now both iterators 
crash if they traverse a sub-node==0.
2. In llvm::PostOrderIterator.h I fixed a compile bug which occured if 
used with external storage (which apparently nobody does until now).
3. I changed the behavior of llvm::DepthFirstIterator.h regarding the 
retrieving of the first child. This is now retrieved in exactly that 
moment it's needed. Until now it was retrieved too early, thus you 
actually couldn't change the childs of a just processed node. I can't 
think of an insane working example, which would break due to this change.
4. I added a public skipChilds member function to df_iterator which acts 
similiar to operator++. However it skips all childs of the currently 
processed node and returns *this. You can use it like in
for (i = df_begin(), e = df_end(); i!=e;)
  foo() ? i.skipChilds() : ++i;

Olaf Krzikalla
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: llvm-iterator.patch
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20090626/55728f28/attachment.ksh>

More information about the llvm-dev mailing list