void EmitBitwiseBoolean(EmitContext ec) { ILGenerator ig = ec.ig; Label load_left = ig.DefineLabel(); Label load_right = ig.DefineLabel(); Label end_label = ig.DefineLabel(); left_unwrap.Emit(ec); ig.Emit(OpCodes.Brtrue_S, load_right); right_unwrap.Emit(ec); ig.Emit(OpCodes.Brtrue_S, load_left); left_unwrap.EmitCheck(ec); ig.Emit(OpCodes.Brfalse_S, load_right); // load left ig.MarkLabel(load_left); if (Oper == Operator.BitwiseAnd) { left_unwrap.Load(ec); } else { right_unwrap.Load(ec); right_unwrap = left_unwrap; } ig.Emit(OpCodes.Br_S, end_label); // load right ig.MarkLabel(load_right); right_unwrap.Load(ec); ig.MarkLabel(end_label); }
void EmitBitwiseBoolean(EmitContext ec) { Label load_left = ec.DefineLabel(); Label load_right = ec.DefineLabel(); Label end_label = ec.DefineLabel(); // null & value, null | value if (left_unwrap == null) { left_unwrap = right_unwrap; right_unwrap = null; right = left; } left_unwrap.Emit(ec); ec.Emit(OpCodes.Brtrue_S, load_right); // value & null, value | null if (right_unwrap != null) { right_unwrap.Emit(ec); ec.Emit(OpCodes.Brtrue_S, load_left); } left_unwrap.EmitCheck(ec); ec.Emit(OpCodes.Brfalse_S, load_right); // load left ec.MarkLabel(load_left); if (Oper == Operator.BitwiseAnd) { left_unwrap.Load(ec); } else { if (right_unwrap == null) { right.Emit(ec); if (right is EmptyConstantCast || right is EmptyCast) { ec.Emit(OpCodes.Newobj, NullableInfo.GetConstructor(type)); } } else { right_unwrap.Load(ec); right_unwrap = left_unwrap; } } ec.Emit(OpCodes.Br_S, end_label); // load right ec.MarkLabel(load_right); if (right_unwrap == null) { if (Oper == Operator.BitwiseAnd) { right.Emit(ec); if (right is EmptyConstantCast || right is EmptyCast) { ec.Emit(OpCodes.Newobj, NullableInfo.GetConstructor(type)); } } else { left_unwrap.Load(ec); } } else { right_unwrap.Load(ec); } ec.MarkLabel(end_label); }