Ejemplo n.º 1
0
        /// <summary>
        /// Function to Search the Billing Period List.
        /// </summary>
        /// <param name="obj"></param>
        /// <returns>void</returns>
        /// <createdBy></createdBy>
        /// <createdOn>May 20,2016</createdOn>
        public void FindCode(object obj)
        {
            CommonSettings.logger.LogInfo(typeof(string), string.Format(CultureInfo.InvariantCulture, Resources.loggerMsgStart, DateTime.Now.ToShortDateString(), DateTime.Now.ToShortTimeString(), MethodBase.GetCurrentMethod().Name));

            try
            {
                Count = 0;
                if (obj == null)
                {
                    CurrentPageIndex = 0;
                }
                if (CurrentPageIndex == 0)
                {
                    Application.Current.Properties["FindUserGridLastScrollOffset"] = 0;
                    Application.Current.Properties["FindUserGridCurrentPageIndex"] = 0;
                }

                CodeProp objCodeProp = new CodeProp();
                objCodeProp.CurrentPageIndex = CurrentPageIndex;
                objCodeProp.PageSize         = CurrentPageIndex > 0 ? _GridPageSizeOnScroll : _GridPageSize;;
                objCodeProp.DefaultPageSize  = _GridPageSize;
                objCodeProp.CodeType         = CodeType;
                var list = new ObservableCollection <CodeProp>(_serviceInstance.FindCode(objCodeProp));
                if (CurrentPageIndex == 0)
                {
                    CodeList = null;
                    CodeList = new ObservableCollection <CodeProp>(list);
                }
                else
                {
                    if (CodeList != null && CodeList.Count > 0)
                    {
                        foreach (CodeProp ud in new ObservableCollection <CodeProp>(list))
                        {
                            CodeList.Add(ud);
                        }
                    }
                }
                Count = CodeList.ToList().Where(x => x.TotalPageCount > 0).FirstOrDefault().TotalPageCount;
            }
            catch (Exception ex)
            {
                LogHelper.LogErrorToDb(ex);
                bool displayErrorOnUI = false;
                CommonSettings.logger.LogError(this.GetType(), ex);
                if (displayErrorOnUI)
                {
                    throw;
                }
            }
            finally
            {
                CommonSettings.logger.LogInfo(typeof(string), string.Format(CultureInfo.InvariantCulture, Resources.loggerMsgEnd, DateTime.Now.ToShortDateString(), DateTime.Now.ToShortTimeString(), MethodBase.GetCurrentMethod().Name));
            }
        }
        /// <summary>
        ///     Построить список базовых блоков по программе в формате трехадресного кода
        /// </summary>
        /// <returns>список базовых блоков</returns>
        public IEnumerable <BasicBlock> CreateBasicBlockList()
        {
            var basicBlockList = new List <BasicBlock>();

            // список лидеров -- хранит "номера строк", 0 -- всегда лидер
            var leaders = new List <int> {
                0
            };

            var commands = CodeList.ToList();

            for (var i = 1; i < commands.Count; ++i)
            {
                var node = commands[i];

                // если в узел есть переход по GoTo
                if (node.IsLabeled)
                {
                    leaders.Add(i);
                }
                // если узел является переходом GoTo
                if (node is Goto)
                {
                    leaders.Add(i + 1);
                }
            }

            // добавляем финальную команду в список для правильной группировки пар
            leaders.Add(commands.Count);

            // группируем список как набор пар:
            // [a0, a1, a2, a3, ...] -> [(a0, a1), (a1, a2), (a2, a3), ...]
            var ranges = leaders.Zip(leaders.Skip(1), Tuple.Create);
            int num    = 0;

            foreach (var range in ranges)
            {
                var bbList = new List <Node>();

                for (var j = range.Item1; j < range.Item2; ++j)
                {
                    bbList.Add(commands[j]);
                }

                var bb = new BasicBlock(bbList, num++);
                basicBlockList.Add(bb);
            }

            return(basicBlockList);
        }