public PersistentUncoveredLocationStore(CodeLocation cl, TypeEx explorableType, int termIndex, int fitnessvalue, FactorySuggestionStore fss) { this.CodeLocation = cl.ToString(); this.MethodSignature = MethodOrFieldAnalyzer.GetMethodSignature(cl.Method); TypeDefinition declaringType; if (!cl.Method.TryGetDeclaringType(out declaringType)) { //TODO:Error } this.ExplorableType = explorableType.ToString(); this.Offset = cl.Offset; this.AssemblyShortName = declaringType.Module.Assembly.Location; this.declaringTypeStr = declaringType.ToString(); this.Fitnessvalue = fitnessvalue; this.TermIndex = termIndex; this.parentfss = fss; }
private static TypeEx AddFieldToMethodEffects(IPexComponent host, TypeEx declaringType, SafeSet<Field> res, SafeSet<Field> directSetFields, SafeDictionary<Field, FieldModificationType> modificationTypeDic, OpCode prevOpcode, Field field, TypeEx fieldType) { SafeDebug.AssumeNotNull(field, "field"); SafeDebug.Assume(!field.IsStatic, "!field.IsStatic"); TypeEx fieldDeclaringType; //The following check ensures that the field belongs to this class //or its base classes if (field.TryGetDeclaringType(out fieldDeclaringType) && declaringType.IsAssignableTo(fieldDeclaringType)) { res.Add(field); var fieldTypeStr = fieldType.ToString(); if (fieldTypeStr == "System.Int32" || fieldTypeStr == "System.Int64" || fieldTypeStr == "System.Int16") { if (prevOpcode == OpCodes.Add) modificationTypeDic[field] = FieldModificationType.INCREMENT; else if (prevOpcode == OpCodes.Sub) modificationTypeDic[field] = FieldModificationType.DECREMENT; else host.Log.LogWarning(WikiTopics.MissingWikiTopic, "fieldmodificationtype", "Encountered unknown modification type for integer type " + prevOpcode); } else { if (field.Type.IsReferenceType) { if (prevOpcode == OpCodes.Ldnull) modificationTypeDic[field] = FieldModificationType.NULL_SET; else if (prevOpcode == OpCodes.Newarr || prevOpcode == OpCodes.Newobj) modificationTypeDic[field] = FieldModificationType.NON_NULL_SET; else host.Log.LogWarning(WikiTopics.MissingWikiTopic, "fieldmodificationtype", "Encountered unknown modification type for reference type " + prevOpcode); } else if (fieldTypeStr == "System.Boolean") { if (prevOpcode == OpCodes.Ldc_I4_0) modificationTypeDic[field] = FieldModificationType.FALSE_SET; else if (prevOpcode == OpCodes.Ldc_I4_1) modificationTypeDic[field] = FieldModificationType.TRUE_SET; else host.Log.LogWarning(WikiTopics.MissingWikiTopic, "fieldmodificationtype", "Encountered unknown modification type for boolean type " + prevOpcode); } } //A heuristic based approach for aliasing analysis for checking whether the field is directly //assigned any parameters if (LdArgOpCodes.Contains(prevOpcode)) directSetFields.Add(field); } return fieldDeclaringType; }