private HashSet <int> InitStatement(Statement stat) { Dictionary <int, int> mapCount = new Dictionary <int, int>(); List <VarExprent> condlst; if (stat.GetExprents() == null) { // recurse on children statements List <int> childVars = new List <int>(); List <Exprent> currVars = new List <Exprent>(); foreach (object obj in stat.GetSequentialObjects()) { if (obj is Statement) { Statement st = (Statement)obj; Sharpen.Collections.AddAll(childVars, InitStatement(st)); if (st.type == DoStatement.Type_Do) { DoStatement dost = (DoStatement)st; if (dost.GetLooptype() != DoStatement.Loop_For && dost.GetLooptype() != DoStatement .Loop_Do) { currVars.Add(dost.GetConditionExprent()); } } else if (st.type == DoStatement.Type_Catchall) { CatchAllStatement fin = (CatchAllStatement)st; if (fin.IsFinally() && fin.GetMonitor() != null) { currVars.Add(fin.GetMonitor()); } } } else if (obj is Exprent) { currVars.Add((Exprent)obj); } } // children statements foreach (int index in childVars) { int?count = mapCount.GetOrNullable(index); if (count == null) { count = 0; } Sharpen.Collections.Put(mapCount, index, count.Value + 1); } condlst = GetAllVars(currVars); } else { condlst = GetAllVars(stat.GetExprents()); } // this statement foreach (VarExprent var in condlst) { Sharpen.Collections.Put(mapCount, var.GetIndex(), 2); } HashSet <int> set = new HashSet <int>(mapCount.Keys); // put all variables defined in this statement into the set foreach (KeyValuePair <int, int> en in mapCount) { if (en.Value > 1) { Sharpen.Collections.Put(mapVarDefStatements, en.Key, stat); } } Sharpen.Collections.Put(mapStatementVars, stat.id, set); return(set); }
public virtual void SetVarDefinitions() { VarNamesCollector vc = varproc.GetVarNamesCollector(); foreach (KeyValuePair <int, Statement> en in mapVarDefStatements) { Statement stat = en.Value; int index = en.Key; if (implDefVars.Contains(index)) { // already implicitly defined continue; } varproc.SetVarName(new VarVersionPair(index, 0), vc.GetFreeName(index)); // special case for if (stat.type == Statement.Type_Do) { DoStatement dstat = (DoStatement)stat; if (dstat.GetLooptype() == DoStatement.Loop_For) { if (dstat.GetInitExprent() != null && SetDefinition(dstat.GetInitExprent(), index )) { continue; } else { List <Exprent> lstSpecial = Sharpen.Arrays.AsList(dstat.GetConditionExprent(), dstat .GetIncExprent()); foreach (VarExprent var in GetAllVars(lstSpecial)) { if (var.GetIndex() == index) { stat = stat.GetParent(); break; } } } } } Statement first = FindFirstBlock(stat, index); List <Exprent> lst; if (first == null) { lst = stat.GetVarDefinitions(); } else if (first.GetExprents() == null) { lst = first.GetVarDefinitions(); } else { lst = first.GetExprents(); } bool defset = false; // search for the first assignment to var [index] int addindex = 0; foreach (Exprent expr in lst) { if (SetDefinition(expr, index)) { defset = true; break; } else { bool foundvar = false; foreach (Exprent exp in expr.GetAllExprents(true)) { if (exp.type == Exprent.Exprent_Var && ((VarExprent)exp).GetIndex() == index) { foundvar = true; break; } } if (foundvar) { break; } } addindex++; } if (!defset) { VarExprent var = new VarExprent(index, varproc.GetVarType(new VarVersionPair(index , 0)), varproc); var.SetDefinition(true); lst.Add(addindex, var); } } }