public virtual VerificationResult Mark(Label label) { // This is, effectively, "follows an unconditional branch & hasn't been seen before" if (MarkCreatesNewVerifier && UsesStrictBranchVerification && !ExpectedStacksAtLabels.ContainsKey(label)) { MustBeEmptyWhenBranchedTo.Add(label); } if (CurrentlyInScope.Count > 0) { StacksAtLabels[label] = GetCurrentStack(); var verify = CheckStackMatches(label); if (verify != null) { return(verify); } } if (MarkCreatesNewVerifier) { var newVerifier = new VerifiableTracker(label, baseless: true); Add(newVerifier, new LinqStack <LinqList <TypeOnStack> >()); MarkCreatesNewVerifier = false; } LinqList <VerifiableTracker> restore; if (RestoreOnMark.TryGetValue(label, out restore)) { // don't copy, we want the *exact* same verifiers restore here AddRange(restore, RestoreStacksOnMark[label]); RestoreOnMark.Remove(label); RestoreStacksOnMark.Remove(label); } var based = CurrentlyInScope.FirstOrDefault(f => !f.IsBaseless); based = based ?? CurrentlyInScope.First(); var fromLabel = new VerifiableTracker(label, based.IsBaseless, based); var fromStack = CurrentlyInScopeStacks[CurrentlyInScope.IndexOf(based)]; Add(fromLabel, CopyStack(fromStack)); if (!VerifyFromLabel.ContainsKey(label)) { VerifyFromLabel[label] = new LinqList <VerifiableTracker>(); } VerifyFromLabel[label].Add(fromLabel); RemoveUnnecessaryVerifiers(); return(VerificationResult.Successful()); }
private VerificationResult VerifyBranchInto(Label to) { LinqList <VerifiableTracker> onInto; if (!VerifyFromLabel.TryGetValue(to, out onInto)) { return(null); } VerifyFromLabel.Remove(to); foreach (var c in CurrentlyInScope.AsEnumerable()) { foreach (var into in onInto.AsEnumerable()) { var completedCircuit = c.Concat(into); var verified = completedCircuit.CollapseAndVerify(); if (!verified.Success) { return(verified); } if (completedCircuit.IsBaseless) { if (!VerifyFromLabel.ContainsKey(completedCircuit.BeganAt)) { VerifyFromLabel[completedCircuit.BeganAt] = new LinqList <VerifiableTracker>(); } VerifyFromLabel[completedCircuit.BeganAt].Add(completedCircuit); } } } return(null); }