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);
}
}