public override void Commit() { base.Commit(); var visitor = new OldScanStateMachine <Label> (this); EnsuresBlock <Label> priorBlock = null; foreach (CFGBlock block in Blocks) { var ensuresBlock = block as EnsuresBlock <Label>; if (ensuresBlock != null) { priorBlock = ensuresBlock; int count = ensuresBlock.Count; visitor.StartBlock(ensuresBlock); for (int i = 0; i < count; i++) { if (ensuresBlock.OriginalForwardDecode <int, Boolean, OldScanStateMachine <Label> > (i, visitor, i)) { ensuresBlock.AddInstruction(i); } } } else { visitor.HandlePotentialCallBlock(block as MethodCallBlock <Label>, priorBlock); } foreach (CFGBlock succ in SuccessorBlocks(block)) { visitor.SetStartState(succ); } } }
public void HandlePotentialCallBlock(MethodCallBlock <Label> block, EnsuresBlock <Label> priorBlock) { if (block == null || this.state != ScanState.InsertingOld) { return; } int count = this.subroutine.SubroutineFacade.MetaDataProvider.Parameters(block.CalledMethod).Count; if (!this.subroutine.SubroutineFacade.MetaDataProvider.IsStatic(block.CalledMethod)) { ++count; } if (count > 1) { this.state = ScanState.OutsideOld; TypeNode mp = this.subroutine.SubroutineFacade.MetaDataProvider.ManagedPointer(this.next_end_old_type); priorBlock.EndOldWithoutInstruction(mp); } else { this.state = ScanState.InsertingOldAfterCall; this.next_end_old_type = this.subroutine.SubroutineFacade.MetaDataProvider.ReturnType(block.CalledMethod); } }
public void StartBlock(EnsuresBlock <Label> block) { if (!this.block_start_state.TryGetValue(block, out this.state)) { this.state = ScanState.OutsideOld; this.block_start_state.Add(block, this.state); } if (this.state == ScanState.InsertingOld) { block.StartOverridingLabels(); } if (this.state == ScanState.InsertingOldAfterCall) { block.StartOverridingLabels(); block.EndOldWithoutInstruction(this.next_end_old_type); this.state = ScanState.OutsideOld; } this.current_block = block; }