private Expression GenTestExprForInts(ObjExpr objx, GenContext context, Type exprType, LabelTarget defaultLabel) { if (exprType == null) { if (RT.booleanCast(RT.WarnOnReflectionVar.deref())) { RT.errPrintWriter().WriteLine("Performance warning, {0}:{1} - case has int tests, but tested expression is not primitive.", Compiler.SourcePathVar.deref(), RT.get(_sourceSpan, RT.StartLineKey)); } ParameterExpression parm = Expression.Parameter(typeof(object), "p"); Expression initParm = Expression.Assign(parm, _expr.GenCode(RHC.Expression, objx, context)); Expression testType = Expression.Call(null, Compiler.Method_Util_IsNonCharNumeric, parm); // matching JVM's handling of char as non-integer Expression expr = GenShiftMask(Expression.Call(null, Compiler.Method_Util_ConvertToInt, parm)); return(Expression.Block( new ParameterExpression[] { parm }, initParm, Expression.IfThen(Expression.Not(testType), Expression.Goto(defaultLabel)), expr)); } else if (exprType == typeof(long) || exprType == typeof(int) || exprType == typeof(short) || exprType == typeof(byte) || exprType == typeof(ulong) || exprType == typeof(uint) || exprType == typeof(ushort) || exprType == typeof(sbyte)) { Expression expr = Expression.Convert(_expr.GenCodeUnboxed(RHC.Expression, objx, context), typeof(int)); return(GenShiftMask(expr)); } else { return(Expression.Goto(defaultLabel)); } }