private static Object divide(final JvmType type, final Object left, final Object right) { if (left instanceof Number && right instanceof Number) { if (type.isIntegral() && ((Number) right).longValue() == 0L) { return null; } switch (type) { case Byte: return (byte) (((Number) left).intValue() / ((Number) right).intValue()); case Character: return (char) ((Number) left).intValue() / ((Number) right).intValue(); case Short: return (short) ((Number) left).intValue() / ((Number) right).intValue(); case Integer: return ((Number) left).intValue() / ((Number) right).intValue(); case Long: return ((Number) left).longValue() / ((Number) right).longValue(); case Float: return ((Number) left).floatValue() / ((Number) right).floatValue(); case Double: return ((Number) left).doubleValue() / ((Number) right).doubleValue(); } } return null; }
private static Object divide(final JvmType type, final Object left, final Object right) { if (left instanceof Number && right instanceof Number) { if (type.isIntegral() && ((Number) right).longValue() == 0L) { return null; } switch (type) { case Byte: return (byte) (((Number) left).intValue() / ((Number) right).intValue()); case Character: return (char) ((Number) left).intValue() / ((Number) right).intValue(); case Short: return (short) ((Number) left).intValue() / ((Number) right).intValue(); case Integer: return ((Number) left).intValue() / ((Number) right).intValue(); case Long: return ((Number) left).longValue() / ((Number) right).longValue(); case Float: return ((Number) left).floatValue() / ((Number) right).floatValue(); case Double: return ((Number) left).doubleValue() / ((Number) right).doubleValue(); } } return null; }
private static Object divide(final JvmType type, final Object left, final Object right) { if (left instanceof Number && right instanceof Number) { if (type.isIntegral() && ((Number) right).longValue() == 0L) { return null; } switch (type) { case Byte: return (byte) (((Number) left).intValue() / ((Number) right).intValue()); case Character: return (char) ((Number) left).intValue() / ((Number) right).intValue(); case Short: return (short) ((Number) left).intValue() / ((Number) right).intValue(); case Integer: return ((Number) left).intValue() / ((Number) right).intValue(); case Long: return ((Number) left).longValue() / ((Number) right).longValue(); case Float: return ((Number) left).floatValue() / ((Number) right).floatValue(); case Double: return ((Number) left).doubleValue() / ((Number) right).doubleValue(); } } return null; }
@Override public Boolean visitPrimitiveType(final PrimitiveType t, final TypeReference s) { final JvmType jt = t.getSimpleType(); final JvmType js = s.getSimpleType(); switch (js) { case Boolean: return jt == JvmType.Boolean; case Byte: return jt != JvmType.Character && jt.isIntegral() && jt.bitWidth() <= js.bitWidth(); case Character: return jt == JvmType.Character; case Short: if (jt == JvmType.Character) { return false; } // fall through case Integer: case Long: return jt.isIntegral() && jt.bitWidth() <= js.bitWidth(); case Float: case Double: return jt.isIntegral() || jt.bitWidth() <= js.bitWidth(); case Void: return jt == JvmType.Void; default: return Boolean.FALSE; } }
private JvmType getIntegralType(Expression expression) { TypeReference type = expression.getInferredType(); if (type == null) return null; JvmType jvmType = type.getSimpleType(); if (!jvmType.isIntegral()) return null; if (jvmType == JvmType.Integer || jvmType == JvmType.Long) return jvmType; // Fix procyon type inference switch (expression.getCode()) { case Add: case Sub: case Div: case Rem: case Mul: case Shr: case Shl: case UShr: case Neg: return JvmType.Integer; default: return jvmType; } }
@Override public Boolean visitPrimitiveType(final PrimitiveType t, final TypeReference s) { final JvmType jt = t.getSimpleType(); final JvmType js = s.getSimpleType(); switch (js) { case Boolean: return jt == JvmType.Boolean; case Byte: return js != JvmType.Character && jt.isIntegral() && jt.bitWidth() <= js.bitWidth(); case Character: return jt == JvmType.Character; case Short: if (jt == JvmType.Character) { return false; } // fall through case Integer: case Long: return jt.isIntegral() && jt.bitWidth() <= js.bitWidth(); case Float: case Double: return jt.isIntegral() || jt.bitWidth() <= js.bitWidth(); case Void: return s.getSimpleType() == JvmType.Void; default: return Boolean.FALSE; } }
@Override public Boolean visitPrimitiveType(final PrimitiveType t, final TypeReference s) { final JvmType jt = t.getSimpleType(); final JvmType js = s.getSimpleType(); switch (js) { case Boolean: return jt == JvmType.Boolean; case Byte: return js != JvmType.Character && jt.isIntegral() && jt.bitWidth() <= js.bitWidth(); case Character: return jt == JvmType.Character; case Short: if (jt == JvmType.Character) { return false; } // fall through case Integer: case Long: return jt.isIntegral() && jt.bitWidth() <= js.bitWidth(); case Float: case Double: return jt.isIntegral() || jt.bitWidth() <= js.bitWidth(); case Void: return s.getSimpleType() == JvmType.Void; default: return Boolean.FALSE; } }
return valueJvmType.isIntegral() && valueJvmType != JvmType.Boolean;
public static boolean hasImplicitNumericConversion(final TypeReference target, final TypeReference source) { VerifyArgument.notNull(source, "source"); VerifyArgument.notNull(target, "target"); if (target == source) { return true; } if (!target.isPrimitive() || !source.isPrimitive()) { return false; } final JvmType targetJvmType = target.getSimpleType(); final JvmType sourceJvmType = source.getSimpleType(); if (targetJvmType == sourceJvmType) { return true; } if (sourceJvmType == JvmType.Boolean) { return false; } switch (targetJvmType) { case Float: case Double: return sourceJvmType.bitWidth() <= targetJvmType.bitWidth(); case Byte: case Short: case Integer: case Long: return sourceJvmType.isIntegral() && sourceJvmType.bitWidth() <= targetJvmType.bitWidth(); } return false; }
public static boolean hasImplicitNumericConversion(final TypeReference target, final TypeReference source) { VerifyArgument.notNull(source, "source"); VerifyArgument.notNull(target, "target"); if (target == source) { return true; } if (!target.isPrimitive() || !source.isPrimitive()) { return false; } final JvmType targetJvmType = target.getSimpleType(); final JvmType sourceJvmType = source.getSimpleType(); if (targetJvmType == sourceJvmType) { return true; } if (sourceJvmType == JvmType.Boolean) { return false; } switch (targetJvmType) { case Float: case Double: return sourceJvmType.bitWidth() <= targetJvmType.bitWidth(); case Byte: case Short: case Integer: case Long: return sourceJvmType.isIntegral() && sourceJvmType.bitWidth() <= targetJvmType.bitWidth(); } return false; }
public static boolean hasImplicitNumericConversion(final TypeReference target, final TypeReference source) { VerifyArgument.notNull(source, "source"); VerifyArgument.notNull(target, "target"); if (target == source) { return true; } if (!target.isPrimitive() || !source.isPrimitive()) { return false; } final JvmType targetJvmType = target.getSimpleType(); final JvmType sourceJvmType = source.getSimpleType(); if (targetJvmType == sourceJvmType) { return true; } if (sourceJvmType == JvmType.Boolean) { return false; } switch (targetJvmType) { case Float: case Double: return sourceJvmType.bitWidth() <= targetJvmType.bitWidth(); case Byte: case Short: case Integer: case Long: return sourceJvmType.isIntegral() && sourceJvmType.bitWidth() <= targetJvmType.bitWidth(); } return false; }
case Float: case Double: if (sourceJvmType.isIntegral() || sourceJvmType.bitWidth() <= targetJvmType.bitWidth()) { return ConversionType.IMPLICIT; if (sourceJvmType.isIntegral() && sourceJvmType.bitWidth() <= targetJvmType.bitWidth()) {
case Float: case Double: if (sourceJvmType.isIntegral() || sourceJvmType.bitWidth() <= targetJvmType.bitWidth()) { return ConversionType.IMPLICIT; if (sourceJvmType.isIntegral() && sourceJvmType.bitWidth() <= targetJvmType.bitWidth()) {
if (expectedType.getSimpleType().isIntegral()) { return expectedType;
if (expectedType.getSimpleType().isIntegral()) { return expectedType;
if (expectedType.getSimpleType().isIntegral()) { return expectedType;
case Float: case Double: { if (sourceJvmType.isIntegral()) { return sourceJvmType.bitWidth() >= targetJvmType.bitWidth() ? ConversionType.IMPLICIT_LOSSY : ConversionType.IMPLICIT; if (sourceJvmType.isIntegral() && sourceJvmType.bitWidth() <= targetJvmType.bitWidth()) {