/// <summary> /// Join that performs trickery to keep bounds on pointers if one side is null /// </summary> /// <param name="pc">PC of join point</param> public StripeWithIntervalsForUnsafeCode Join(StripeWithIntervalsForUnsafeCode prevState, APC pc) { IntervalsForUnsafeCode thisInterval = (IntervalsForUnsafeCode)this.Left.Clone(); IntervalsForUnsafeCode prevInterval = (IntervalsForUnsafeCode)prevState.Left.Clone(); IntervalsForUnsafeCode joinLeftPart = (IntervalsForUnsafeCode)((IntervalsForUnsafeCode)this.Left).Join(prevState.Left, this.nullPointers.Union(prevState.nullPointers), pc); // Pietro's // if (!light) if (true) { //Before permorming the join, it refines the information contained in the domain StripeForUnsafeCode thisRightRefined = (StripeForUnsafeCode)((StripeForUnsafeCode)this.Right).RefineInternally(); StripeForUnsafeCode prevRightRefined = (StripeForUnsafeCode)((StripeForUnsafeCode)prevState.Right).RefineInternally(); StripeForUnsafeCode joinRightPart = (StripeForUnsafeCode)thisRightRefined.Join(prevRightRefined, this.nullPointers.Union(prevState.nullPointers), thisInterval, prevInterval, pc); //It resets the set of the bottom pointers nullPointers = new Set <BoxedExpression>(); return((StripeWithIntervalsForUnsafeCode)prevState.Reduce(joinLeftPart, joinRightPart)); } //else //{ // StripeForUnsafeCode joinRightPart = (StripeForUnsafeCode)this.Right.Join(prevState.Right, this.nullPointers.Union(prevState.nullPointers)); // nullPointers = new Set<BoxedExpression>(); // return (StripeWithIntervalsForUnsafeCode)prevState.Reduce(joinLeftPart, joinRightPart); //} }
public StripeWithIntervalsForUnsafeCode Widening(StripeWithIntervalsForUnsafeCode prevState, APC pc) { IntervalsForUnsafeCode thisInterval = (IntervalsForUnsafeCode)this.Left.Clone(); IntervalsForUnsafeCode prevInterval = (IntervalsForUnsafeCode)prevState.Left.Clone(); if (this.IsBottom) { return(prevState); } if (prevState.IsBottom) { return(this); } IntervalsForUnsafeCode joinLeftPart = (IntervalsForUnsafeCode)((IntervalsForUnsafeCode)this.Left).Widening(prevState.Left); // Pietro's //if (!light) if (true) { //Since our domain is of finite height, we can use the version of join operator improved with the information abount null pointers StripeForUnsafeCode thisRightRefined = (StripeForUnsafeCode)((StripeForUnsafeCode)this.Right).RefineInternally(); StripeForUnsafeCode prevRightRefined = (StripeForUnsafeCode)((StripeForUnsafeCode)prevState.Right).RefineInternally(); StripeForUnsafeCode joinRightPart = (StripeForUnsafeCode)thisRightRefined.Join(prevRightRefined, this.nullPointers.Union(prevState.nullPointers), thisInterval, prevInterval, pc); //It resets the set of the bottom pointers nullPointers = new Set <BoxedExpression>(); return((StripeWithIntervalsForUnsafeCode)prevState.Reduce(joinLeftPart, joinRightPart)); } //else //{ // StripeForUnsafeCode joinRightPart = (StripeForUnsafeCode)this.Right.Join(prevState.Right, this.nullPointers.Union(prevState.nullPointers)); // nullPointers = new Set<BoxedExpression>(); // return (StripeWithIntervalsForUnsafeCode)prevState.Reduce(joinLeftPart, joinRightPart); //} }