protected override void EmitBinaryOperator(MethodContext method, Compiler compiler, ExpressionContext left, ExpressionContext right, Parse.BinaryExpression expression)
{
switch (expression.Operator)
{
case Parse.Operator.Addition:
left.EmitGet(method);
right.EmitGet(method);
method.IL.EmitCall(OpCodes.Call, ReflectionUtility.StringConcat, null);
break;
case Parse.Operator.Equal:
base.EmitBinaryOperator(method, compiler, left, right, expression);
break;
case Parse.Operator.NotEqual:
left.EmitGet(method);
right.EmitGet(method);
method.IL.EmitCall(OpCodes.Call, ReflectionUtility.StringCompare, null);
method.IL.Emit(OpCodes.Ldc_I4_0);
method.IL.Emit(OpCodes.Ceq);
// Not
method.IL.Emit(OpCodes.Ldc_I4_0);
method.IL.Emit(OpCodes.Ceq);
break;
case Parse.Operator.InclusiveGreater:
left.EmitGet(method);
right.EmitGet(method);
method.IL.EmitCall(OpCodes.Call, ReflectionUtility.StringCompare, null);
method.IL.Emit(OpCodes.Ldc_I4_0);
method.IL.Emit(OpCodes.Clt);
// Not
method.IL.Emit(OpCodes.Ldc_I4_0);
method.IL.Emit(OpCodes.Ceq);
break;
case Parse.Operator.InclusiveLess:
left.EmitGet(method);
right.EmitGet(method);
method.IL.EmitCall(OpCodes.Call, ReflectionUtility.StringCompare, null);
method.IL.Emit(OpCodes.Ldc_I4_0);
method.IL.Emit(OpCodes.Cgt);
// Not
method.IL.Emit(OpCodes.Ldc_I4_0);
method.IL.Emit(OpCodes.Ceq);
break;
case Parse.Operator.Greater:
left.EmitGet(method);
right.EmitGet(method);
method.IL.EmitCall(OpCodes.Call, ReflectionUtility.StringCompare, null);
method.IL.Emit(OpCodes.Ldc_I4_0);
method.IL.Emit(OpCodes.Cgt);
break;
case Parse.Operator.Less:
left.EmitGet(method);
right.EmitGet(method);
method.IL.EmitCall(OpCodes.Call, ReflectionUtility.StringCompare, null);
method.IL.Emit(OpCodes.Ldc_I4_0);
method.IL.Emit(OpCodes.Clt);
break;
default: throw NotSupported(expression);
}
}