/// <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); }