public void CallArithmeticOp(QilNodeType opType, XmlTypeCode code)
{
MethodInfo meth = null;
switch (code)
{
case XmlTypeCode.Int:
case XmlTypeCode.Integer:
case XmlTypeCode.Double:
case XmlTypeCode.Float:
switch (opType)
{
case QilNodeType.Add: Emit(OpCodes.Add); break;
case QilNodeType.Subtract: Emit(OpCodes.Sub); break;
case QilNodeType.Multiply: Emit(OpCodes.Mul); break;
case QilNodeType.Divide: Emit(OpCodes.Div); break;
case QilNodeType.Modulo: Emit(OpCodes.Rem); break;
case QilNodeType.Negate: Emit(OpCodes.Neg); break;
default: Debug.Assert(false, opType + " must be an arithmetic operation."); break;
}
break;
case XmlTypeCode.Decimal:
switch (opType)
{
case QilNodeType.Add: meth = XmlILMethods.DecAdd; break;
case QilNodeType.Subtract: meth = XmlILMethods.DecSub; break;
case QilNodeType.Multiply: meth = XmlILMethods.DecMul; break;
case QilNodeType.Divide: meth = XmlILMethods.DecDiv; break;
case QilNodeType.Modulo: meth = XmlILMethods.DecRem; break;
case QilNodeType.Negate: meth = XmlILMethods.DecNeg; break;
default: Debug.Assert(false, opType + " must be an arithmetic operation."); break;
}
Call(meth);
break;
default:
Debug.Assert(false, "The " + opType + " arithmetic operation cannot be performed on values of type " + code + ".");
break;
}
}