internal ITraceLogItem GetItems(IFormalCodeItem target) { if(!StepsForCode.ContainsKey(target)) return EmptyItem; var data = StepsForCode[target].Select(item => Steps[item]); return new TraceLogItem(data, SourceView); }
void ITraceCollector.Run(DataStack dataStack, IFormalCodeItem codeBase) { var beforeSize = dataStack.Size; var index = Steps.Count; var item = new Step(codeBase, dataStack, index, Frames.ToArray()); Steps.Add(item); AssumeStepsForCode(item.CodeBase, index); try { codeBase.Visit(dataStack); } catch(Exception exception) { item.Exception = exception; dataStack.Size = beforeSize + codeBase.Size; } item.AfterStack = dataStack; }
void AssumeStepsForCode(IFormalCodeItem item, int index) { if(!StepsForCode.ContainsKey(item)) StepsForCode.Add(item, new int[0]); StepsForCode[item] = StepsForCode[item].Concat(new[] {index}).ToArray(); }
void SubVisit(IFormalCodeItem codeBase) { if(TraceCollector == null) codeBase.Visit(this); else TraceCollector.Run(this, codeBase); }
internal void SignalClickedCode(IFormalCodeItem codeBase) => SignalClickedObject(Compiler.FindFunction(codeBase));
internal ITraceLogItem TraceLogItem(IFormalCodeItem target) => TraceLog.GetItems(target);