Hi, I am trying to add a statement s1 outside of an if and another
statement s2 inside of the if as below

s1;
if  (cond1 && cond2 && cond3){
     s2;
}

CIL breaks that into multiple nested if's  so it will look like
s1;
if(cond1){
    if(cond2){
        if (cond3){
           s2;
        }
    }
}


I wrote the following simple code for this purpose but it's not
correct -- it enters an infinite loop and I think the reason is at the
line (**problem here**)   --- because it adds the new statement s1 to
the current if stuff ... then Do the children ,  so again revisit the
current if stuff   .


(*check if there's no more if's*)
let isInnerMostBlock b =
  let isIfTheFirst stmt = match stmt.skind with If(cond,b1,b2,l) ->
true |_ -> false in
  match b.bstmts with  [] -> true |(fst_stmt::_) -> not (isIfTheFirst fst_stmt)

class nestedIfConds () = object
  inherit nopCilVisitor
  val mutable inNestedIf  = false

  method vstmt s = (
        match s.skind with
          |If(cond,b1,b2,l)-> (
                  if inNestedIf = false then (
                        debug "Entering if\n";
                        inNestedIf <- true;
                        let s1 = mkEmptyStmt () in
                        s.skind <- Block(mkBlock([s1;{s with labels = []}]))  
(** problem here**)
                  );

                  if (isInnerMostBlock b1) then (
                        inNestedIf <- false;

                        let s2 = mkEmptyStmt () in
                        b1.bstmts <- s2::b1.bstmts
                  );
                  DoChildren
                )


          |_ -> DoChildren
  )
end

 I am not sure how to do this correctly ? e.g., using different
Visitor action like ChangeTo  or DoChildren Post etc ?   I don't think
DoChildrenPost does what I want because it travels all the ways down
to if(cond3) and returns back from there.    Greatly appreciate all
the helps  !





VN -

------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
CIL-users mailing list
CIL-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/cil-users

Reply via email to