/// <summary> /// Sets the jump type of the Cond, based on the original relational operator, and a pattern /// </summary> /// <param name="originalrelop">The original relational operator</param> private void LessPattern(Instruction.RelationalOperationType originalrelop) { relop = (Instruction.RelationalOperationType)Randomizer.OneFromMany(Instruction.RelationalOperationType.Equals, Instruction.RelationalOperationType.Greater, Instruction.RelationalOperationType.GreaterOrEquals, Instruction.RelationalOperationType.NotEquals, Instruction.RelationalOperationType.Smaller, Instruction.RelationalOperationType.SmallerOrEquals); if (relop == Instruction.RelationalOperationType.Smaller || relop == Instruction.RelationalOperationType.SmallerOrEquals || relop == Instruction.RelationalOperationType.Equals) { if (originalrelop == Instruction.RelationalOperationType.Greater || originalrelop == Instruction.RelationalOperationType.GreaterOrEquals || originalrelop == Instruction.RelationalOperationType.Equals) { JumpType = BlockJumpType.False; } else { JumpType = BlockJumpType.True; } } else { JumpType = BlockJumpType.Ambigious; } }
/// <summary> /// Sets the jump type of a Cond /// </summary> /// <param name="generatedconstant">The constant which has been generated by us</param> /// <param name="originalconstant">The original constant</param> /// <param name="originalrelop">The original relational operator</param> private void SetJumpType(int generatedconstant, int originalconstant, Instruction.RelationalOperationType originalrelop) { if (generatedconstant == originalconstant - 1) { switch (originalrelop) { case Instruction.RelationalOperationType.GreaterOrEquals: relop = Instruction.RelationalOperationType.Greater; JumpType = BlockJumpType.Last; break; case Instruction.RelationalOperationType.Smaller: relop = Instruction.RelationalOperationType.SmallerOrEquals; JumpType = BlockJumpType.Last; break; case Instruction.RelationalOperationType.Equals: relop = Instruction.RelationalOperationType.Greater; JumpType = BlockJumpType.Last; break; case Instruction.RelationalOperationType.NotEquals: relop = Instruction.RelationalOperationType.Smaller; JumpType = BlockJumpType.Last; break; default: LessPattern(originalrelop); break; } } else if (generatedconstant == originalconstant + 1) { switch (originalrelop) { case Instruction.RelationalOperationType.Greater: relop = Instruction.RelationalOperationType.GreaterOrEquals; JumpType = BlockJumpType.Last; break; case Instruction.RelationalOperationType.SmallerOrEquals: relop = Instruction.RelationalOperationType.Smaller; JumpType = BlockJumpType.Last; break; case Instruction.RelationalOperationType.Equals: relop = Instruction.RelationalOperationType.Smaller; JumpType = BlockJumpType.Last; break; case Instruction.RelationalOperationType.NotEquals: relop = Instruction.RelationalOperationType.Greater; JumpType = BlockJumpType.Last; break; default: GreaterPattern(originalrelop); break; } } else if (generatedconstant < originalconstant) { LessPattern(originalrelop); } else { GreaterPattern(originalrelop); } }