private void TraverseAdditionRightOperandAndDoOperation(IExpression expression) {
Contract.Assume(expression is IAddition);
var addition = (IAddition)expression;
this.Traverse(addition.RightOperand);
OperationCode operationCode = OperationCode.Add;
if (addition.CheckOverflow) {
if (TypeHelper.IsSignedPrimitive(addition.Type))
operationCode = OperationCode.Add_Ovf;
else if (TypeHelper.IsUnsignedPrimitive(addition.Type))
operationCode = OperationCode.Add_Ovf_Un;
else if (addition.Type.TypeCode == PrimitiveTypeCode.Pointer
|| addition.Type.TypeCode == PrimitiveTypeCode.Reference) {
if (TypeHelper.IsSignedPrimitive(addition.LeftOperand.Type) ||
TypeHelper.IsSignedPrimitive(addition.RightOperand.Type))
operationCode = OperationCode.Add_Ovf;
else
operationCode = OperationCode.Add_Ovf_Un;
}
}
this.EmitSourceLocation(addition);
this.generator.Emit(operationCode);
this.StackSize--;
}