protected virtual void EmitShortCircuit(MethodContext method, Compiler compiler, Frame frame, ExpressionContext left, ExpressionContext right, Parse.BinaryExpression expression, Type.BaseType typeHint)
{
var leftType = left.Type.GetNative(compiler.Emitter);
var rightType = right.Type.GetNative(compiler.Emitter);
left.EmitGet(method);
right.EmitGet(method);
switch (expression.Operator)
{
case Parse.Operator.And:
if (!CallClassOp(method, "op_LogicalAnd", leftType, leftType))
{
var label = method.IL.DefineLabel();
method.IL.Emit(OpCodes.Dup);
method.IL.Emit(OpCodes.Brfalse_S, label);
right.EmitGet(method);
method.IL.Emit(OpCodes.And);
method.IL.MarkLabel(label);
}
break;
case Parse.Operator.Or:
if (!CallClassOp(method, "op_LogicalOr", leftType, leftType))
{
var label = method.IL.DefineLabel();
method.IL.Emit(OpCodes.Dup);
method.IL.Emit(OpCodes.Brtrue_S, label);
right.EmitGet(method);
method.IL.Emit(OpCodes.Or);
method.IL.MarkLabel(label);
}
break;
default: throw new NotSupportedException(String.Format("Operator {0} is not supported.", expression.Operator));
}
}