diff --git a/src/FastExpressionCompiler/FastExpressionCompiler.cs b/src/FastExpressionCompiler/FastExpressionCompiler.cs index f3d986fb..332ecc32 100644 --- a/src/FastExpressionCompiler/FastExpressionCompiler.cs +++ b/src/FastExpressionCompiler/FastExpressionCompiler.cs @@ -2568,7 +2568,7 @@ private static bool TryEmitCoalesceOperator(BinaryExpression expr, ILGenerator i il.DmarkLabel(labelFalse); else { - il.Demit(OpCodes.Br, labelDone); + il.Demit(OpCodes.Br_S, labelDone); // safe: jumps over Castclass (5 bytes) = 5 bytes il.DmarkLabel(labelFalse); // todo: @bug? should we insert the boxing for the Nullable value type before the Castclass il.Demit(OpCodes.Castclass, exprType); il.DmarkLabel(labelDone); @@ -2947,9 +2947,9 @@ private static bool TryEmitSimpleUnaryExpression(UnaryExpression expr, Expressio { var falseLabel = il.DefineLabel(); var continueLabel = il.DefineLabel(); - il.Demit(OpCodes.Brfalse, falseLabel); + il.Demit(OpCodes.Brfalse_S, falseLabel); // safe: jumps over Ldc_I4_0 (1 byte) + Br_S (2 bytes) = 3 bytes il.Demit(OpCodes.Ldc_I4_0); - il.Demit(OpCodes.Br, continueLabel); + il.Demit(OpCodes.Br_S, continueLabel); // safe: jumps over Ldc_I4_1 (1 byte) = 1 byte il.DmarkLabel(falseLabel); il.Demit(OpCodes.Ldc_I4_1); il.DmarkLabel(continueLabel); @@ -5767,9 +5767,9 @@ var methodName var resultLabel = il.DefineLabel(); var isNullLabel = il.DefineLabel(); EmitLoadLocalVariable(il, leftHasValueVar); - il.Demit(OpCodes.Brfalse, isNullLabel); + il.Demit(OpCodes.Brfalse_S, isNullLabel); // safe: jumps over EmitLoadLocalVariable (1-4 bytes) + Brtrue_S (2 bytes) = 3-6 bytes EmitLoadLocalVariable(il, rightHasValueVar); - il.Demit(OpCodes.Brtrue, resultLabel); + il.Demit(OpCodes.Brtrue_S, resultLabel); // safe: jumps over Pop (1 byte) + Ldnull (1 byte) = 2 bytes il.DmarkLabel(isNullLabel); il.Demit(OpCodes.Pop); il.Demit(OpCodes.Ldnull); @@ -5974,7 +5974,7 @@ private static bool TryEmitLogicalOperator(BinaryExpression expr, ExpressionType return false; var labelDone = il.DefineLabel(); - il.Demit(OpCodes.Br, labelDone); + il.Demit(OpCodes.Br_S, labelDone); // safe: jumps over Ldc_I4_0 or Ldc_I4_1 (1 byte) = 1 byte il.DmarkLabel(labelSkipRight); // label the second branch il.Demit(nodeType == ExpressionType.AndAlso ? OpCodes.Ldc_I4_0 : OpCodes.Ldc_I4_1); diff --git a/test/FastExpressionCompiler.IssueTests/Issue159_NumericConversions.cs b/test/FastExpressionCompiler.IssueTests/Issue159_NumericConversions.cs index 0b2c68fa..f82fee26 100644 --- a/test/FastExpressionCompiler.IssueTests/Issue159_NumericConversions.cs +++ b/test/FastExpressionCompiler.IssueTests/Issue159_NumericConversions.cs @@ -365,7 +365,7 @@ public void ComparisonsWithConversionsShouldWork4() OpCodes.Cgt_Un, OpCodes.Ldc_I4_0, OpCodes.Ceq, - OpCodes.Br, + OpCodes.Br_S, // short form: jumps over Ldc_I4_0 (1 byte) = 1 byte OpCodes.Ldc_I4_0, OpCodes.Ret);