StatementList TranslateInstructions(out Dictionary <string, BoogieVariable> temporalVariables) { InstructionTranslator instTranslator = new InstructionTranslator(this.CHA, methodBody, CFG, inputAssemblies); instTranslator.Translate(); foreach (var v in instTranslator.RemovedVariables) { methodBody.Variables.Remove(v); } foreach (var v in instTranslator.AddedVariables) { methodBody.Variables.Add(v); } temporalVariables = instTranslator.temporalVariables; return(instTranslator.Boogie()); }
public override StatementList WriteInstanceField(InstanceFieldAccess instanceFieldAccess, Expression expr, InstructionTranslator instTranslator) { StatementList stmts = new StatementList(); String fieldName = FieldTranslator.GetFieldName(instanceFieldAccess.Field); //var addr = AddressOf(instanceFieldAccess); //var writeAddr = WriteAddr(addr, value); if (!Settings.SplitFieldsEnabled()) { if (!Helpers.IsBoogieRefType(expr.Type)) // int, bool, real { stmts.Add(Expression.AssumeInverseRelationUnionAndPrimitiveType(expr)); stmts.Add(dispatcher.WriteAddr(dispatcher.AddressOf(instanceFieldAccess), Expression.PrimitiveType2Union(expr, instTranslator.Boogie()))); //sb.AppendLine(String.Format("\t\t$Heap := Write($Heap, {0}, {1}, {2});", instanceFieldAccess.Instance, fieldName, PrimitiveType2Union(Helpers.GetBoogieType(value.Type), value.Name))); } else { stmts.Add(dispatcher.WriteAddr(dispatcher.AddressOf(instanceFieldAccess), expr)); //sb.AppendLine(String.Format("\t\t$Heap := Write($Heap, {0}, {1}, {2});", instanceFieldAccess.Instance, fieldName, value.Name)); } } else { var boogieType = expr.Type; // var heapAccess = String.Format("{0}[{1}]", fieldName, instanceFieldAccess.Instance); //F$ConsoleApplication3.Foo.p[f_Ref] := $ArrayContents[args][0]; if (Helpers.IsGenericField(instanceFieldAccess.Field) && !boogieType.Equals(Helpers.BoogieType.Ref)) { stmts.Add(Expression.AssumeInverseRelationUnionAndPrimitiveType(expr)); //sb.AppendLine(VariableAssignment(heapAccess, PrimitiveType2Union(boogieType, value.Name))); stmts.Add(dispatcher.WriteAddr(dispatcher.AddressOf(instanceFieldAccess), Expression.PrimitiveType2Union(expr, instTranslator.Boogie()))); } else { stmts.Add(dispatcher.WriteAddr(dispatcher.AddressOf(instanceFieldAccess), expr)); } } return(stmts); }
public override StatementList WriteInstanceField(InstanceFieldAccess instanceFieldAccess, Expression expr, InstructionTranslator instTranslator) { StatementList stmts = new StatementList(); var boogieType = expr.Type; if (Helpers.IsGenericField(instanceFieldAccess.Field) && !boogieType.Equals(Helpers.BoogieType.Object)) { stmts.Add(Expression.AssumeInverseRelationUnionAndPrimitiveType(expr)); stmts.Add(dispatcher.WriteAddr(dispatcher.AddressOf(instanceFieldAccess), Expression.PrimitiveType2Union(expr, instTranslator.Boogie()))); } else { stmts.Add(dispatcher.WriteAddr(dispatcher.AddressOf(instanceFieldAccess), expr)); } return(stmts); }