Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
                }
            }
        }