public static ForwardAnalysisSolver <AState, Type, EdgeData> Make <Local, Parameter, Method, Field, Source, Dest, Context>( IDecodeMSIL <APC, Local, Parameter, Method, Field, Type, Source, Dest, Context, EdgeData> decoder, IAnalysis <APC, AState, IVisitMSIL <APC, Local, Parameter, Method, Field, Type, Source, Dest, AState, AState>, EdgeData> driver, ILPrinter <APC> printer ) where Context : IMethodContext <Field, Method> { Contract.Requires(decoder != null); Contract.Requires(driver != null); IVisitMSIL <APC, Local, Parameter, Method, Field, Type, Source, Dest, AState, AState> visitor = driver.Visitor(); var result = new ForwardAnalysisSolver <AState, Type, EdgeData>( decoder.Context.MethodContext.CFG, delegate(APC pc, AState state) { return(decoder.ForwardDecode <AState, AState, IVisitMSIL <APC, Local, Parameter, Method, Field, Type, Source, Dest, AState, AState> >(pc, visitor, state)); }, driver.EdgeConversion, driver.Join, driver.ImmutableVersion, driver.MutableVersion, driver.Dump, delegate(APC pc, AState state) { return(decoder.IsUnreachable(pc) || driver.IsBottom(pc, state)); }, delegate(APC pc, AState state) { return(driver.IsTop(pc, state)); }, printer, decoder.Display, decoder.EdgeData ); result.CachePolicy = driver.CacheStates(result); return(result); }
public static ForwardAnalysis <AbstractState, EdgeData> Make <Source, Dest, Context> ( IILDecoder <APC, Source, Dest, Context, EdgeData> decoder, IAnalysis <APC, AbstractState, IILVisitor <APC, Source, Dest, AbstractState, AbstractState>, EdgeData> analysis) where Context : IMethodContextProvider { IILVisitor <APC, Source, Dest, AbstractState, AbstractState> visitor = analysis.GetVisitor(); var forwardAnalysisSolver = new ForwardAnalysis <AbstractState, EdgeData> ( decoder.ContextProvider.MethodContext.CFG, (pc, state) => decoder.ForwardDecode <AbstractState, AbstractState, IILVisitor <APC, Source, Dest, AbstractState, AbstractState> > (pc, visitor, state), analysis.Join, analysis.ImmutableVersion, analysis.MutableVersion, analysis.EdgeConversion, decoder.EdgeData, (pc, state) => { if (!decoder.IsUnreachable(pc)) { return(analysis.IsBottom(pc, state)); } return(true); }, analysis.Dump ); analysis.SaveFixPointInfo(forwardAnalysisSolver); return(forwardAnalysisSolver); }