public static Interval GetIntervalForType(TypeNode type, IMetaDataProvider provider) { if (provider.Equal(provider.System_Int8, type)) { return(Int8Range); } if (provider.Equal(provider.System_Int32, type)) { return(Int32Range); } if (provider.Equal(provider.System_Int64, type)) { return(Int64Range); } return(TopValue); }
public override Domain <E, V> Entry(APC pc, Method method, Domain <E, V> data) { APC at = ContextProvider.MethodContext.CFG.Next(pc); Domain <E, V> domain = data; IIndexable <Parameter> parameters = MetaDataProvider.Parameters(method); TypeNode eventArgsType; bool systemType = MetaDataProvider.TryGetSystemType("System.EventArgs", out eventArgsType); for (int i = 0; i < parameters.Count; i++) { Parameter p = parameters [i]; TypeNode pType = MetaDataProvider.ParameterType(p); if (MetaDataProvider.IsManagedPointer(pType)) { V sv; if (ContextProvider.ValueContext.TryParameterValue(at, p, out sv)) { domain = AssumeNonNull(sv, domain); } } else { V sv; if (i == 0 && parameters.Count == 1 && MetaDataProvider.IsArray(pType) && MetaDataProvider.Name(method) == "Main" && MetaDataProvider.IsStatic(method) && ContextProvider.ValueContext.TryParameterValue(pc, p, out sv)) { domain = AssumeNonNull(sv, domain); } } } V sv1; if (systemType && parameters.Count == 2 && MetaDataProvider.Equal(MetaDataProvider.System_Object, MetaDataProvider.ParameterType(parameters [0])) && MetaDataProvider.DerivesFrom(MetaDataProvider.ParameterType(parameters [1]), eventArgsType) && ContextProvider.ValueContext.TryParameterValue(pc, parameters [1], out sv1)) { domain = AssumeNonNull(sv1, domain); } if (!MetaDataProvider.IsStatic(method) && ContextProvider.ValueContext.TryParameterValue(pc, MetaDataProvider.This(method), out sv1)) { domain = AssumeNonNull(sv1, domain); } return(domain); }
public override LispList <Pair <EdgeTag, Subroutine> > GetOrdinaryEdgeSubroutines(CFGBlock from, CFGBlock to, LispList <Edge <CFGBlock, EdgeTag> > context) { IMetaDataProvider metadataDecoder = this.SubroutineFacade.MetaDataProvider; var apc = new APC(to, 0, context); DecoratorHelper.Push(this); try { LispList <Pair <EdgeTag, Subroutine> > list = DecoratorHelper.Dispatch <IEdgeSubroutineAdaptor> (this).GetOrdinaryEdgeSubroutinesInternal(from, to, context); if (apc.InsideContract) { if (context != null && !list.IsEmpty()) { Method calledMethod; bool isNewObj; bool isVirtual; if (@from.IsMethodCallBlock(out calledMethod, out isNewObj, out isVirtual) && isVirtual && ((IStackInfo)this).IsCallOnThis(new APC(@from, 0, null))) { TypeNode type = metadataDecoder.DeclaringType(calledMethod); do { if (context.Head.Tag.Is(EdgeTag.InheritedMask) || context.Head.Tag.Is(EdgeTag.ExtraMask) || context.Head.Tag.Is(EdgeTag.OldMask)) { context = context.Tail; } else { Method calledMethod2; bool isNewObj2; bool isVirtual2; if (context.Head.Tag.Is(EdgeTag.AfterMask) && context.Head.From.IsMethodCallBlock(out calledMethod2, out isNewObj2, out isVirtual2)) { TypeNode sub = metadataDecoder.DeclaringType(calledMethod2); if (metadataDecoder.DerivesFrom(sub, type)) { type = sub; } if (!DecoratorHelper.Dispatch <IStackInfo> (this).IsCallOnThis(new APC(context.Head.From, 0, null))) { break; } } else if (context.Head.Tag.Is(EdgeTag.BeforeMask) && context.Head.To.IsMethodCallBlock(out calledMethod2, out isNewObj2, out isVirtual2)) { TypeNode sub = metadataDecoder.DeclaringType(calledMethod2); if (metadataDecoder.DerivesFrom(sub, type)) { type = sub; } if (!DecoratorHelper.Dispatch <IStackInfo> (this).IsCallOnThis(new APC(context.Head.To, 0, null))) { break; } } else if (context.Head.Tag == EdgeTag.Exit) { var methodInfo = context.Head.From.Subroutine as IMethodInfo; if (methodInfo != null) { TypeNode sub = metadataDecoder.DeclaringType(methodInfo.Method); if (metadataDecoder.DerivesFrom(sub, type)) { type = sub; } } break; } else { if (context.Head.Tag != EdgeTag.Entry) { return(list); } var methodInfo = context.Head.From.Subroutine as IMethodInfo; if (methodInfo != null) { TypeNode sub = metadataDecoder.DeclaringType(methodInfo.Method); if (metadataDecoder.DerivesFrom(sub, type)) { type = sub; } } break; } context = context.Tail; } } while (!context.IsEmpty()); Method implementingMethod; if (!metadataDecoder.Equal(type, metadataDecoder.DeclaringType(calledMethod)) && metadataDecoder.TryGetImplementingMethod(type, calledMethod, out implementingMethod)) { list = SpecializedEnsures(list, this.SubroutineFacade.GetEnsures(calledMethod), this.SubroutineFacade.GetEnsures(implementingMethod)); } } } } else { Method calledMethod; bool isNewObj; bool isVirtual; if (@from.IsMethodCallBlock(out calledMethod, out isNewObj, out isVirtual)) { if (DecoratorHelper.Dispatch <IStackInfo> (this).IsCallOnThis(new APC(@from, 0, null))) { var methodInfo = @from.Subroutine as IMethodInfo; if (methodInfo != null) { TypeNode bestType = metadataDecoder.DeclaringType(methodInfo.Method); Method implementingMethod; if (isVirtual && metadataDecoder.TryGetImplementingMethod(bestType, calledMethod, out implementingMethod)) { list = SpecializedEnsures(list, this.SubroutineFacade.GetEnsures(calledMethod), this.SubroutineFacade.GetEnsures(implementingMethod)); } list = InsertInvariant(@from, list, calledMethod, ref bestType, context); } } } } return(list); } finally { DecoratorHelper.Pop(); } }