ValueConversion.unbox* fixes(?)

Rémi Forax forax at univ-mlv.fr
Fri Nov 12 05:35:49 PST 2010


  Le 12/11/2010 12:26, Christian Thalinger a écrit :
> As I have already said, I'm not expert here but these changes let all
> tests of this testcase pass:
>
> http://cr.openjdk.java.net/~twisti/6998541/webrev.00/test/compiler/6998541/Test6998541.java.html
>
> I'm not sure if the assumption is correct that every non-zero
> primitive value is a boolean true.
>
> John, Remi, I'd like your opinion on that.
>
> -- Christian

Christian,
methods unboxRaw call unbox versions, so you have also changed
the semantics of all methods unboxRaw which seems a bad idea.

Rémi

>
> --- /Users/twisti/bsd-port/bsd-port/jdk/src/share/classes/sun/dyn/util/
> ValueConversions.java	2010-11-12 10:04:15.000000000 +0100
> +++ sun/dyn/util/ValueConversions.java	2010-11-12 11:51:29.000000000
> +0100
> @@ -52,42 +52,61 @@
>
>        static int unboxInteger(Object x) {
>            if (x == null)  return 0;  // never NPE
> -        return ((Integer) x).intValue();
> +        if (x instanceof Boolean  )  return (int) (((Boolean)
> x).booleanValue() ? 1 : 0);
> +        if (x instanceof Character)  return (int)  ((Character)
> x).charValue();
> +        return ((Number) x).intValue();
>        }
>
>        static byte unboxByte(Object x) {
>            if (x == null)  return 0;  // never NPE
> -        return ((Byte) x).byteValue();
> +        if (x instanceof Boolean  )  return (byte) (((Boolean)
> x).booleanValue() ? 1 : 0);
> +        if (x instanceof Character)  return (byte)  ((Character)
> x).charValue();
> +        return ((Number) x).byteValue();
>        }
>
>        static short unboxShort(Object x) {
>            if (x == null)  return 0;  // never NPE
> -        return ((Short) x).shortValue();
> +        if (x instanceof Boolean  )  return (short) (((Boolean)
> x).booleanValue() ? 1 : 0);
> +        if (x instanceof Character)  return (short)  ((Character)
> x).charValue();
> +        return ((Number) x).shortValue();
>        }
>
>        static boolean unboxBoolean(Object x) {
>            if (x == null)  return false;  // never NPE
> -        return ((Boolean) x).booleanValue();
> +        if (x instanceof Boolean  )  return ((Boolean)
> x).booleanValue();
> +        if (x instanceof Character)  return ((Character)
> x).charValue()   != 0;
> +        if (x instanceof Long     )  return ((Long)
> x).longValue()   != 0L;
> +        if (x instanceof Float    )  return ((Float)
> x).floatValue()  != 0.0f;
> +        if (x instanceof Double   )  return ((Double)
> x).doubleValue() != 0.0d;
> +        return ((Number) x).intValue() != 0;
>        }
>
>        static char unboxCharacter(Object x) {
>            if (x == null)  return 0;  // never NPE
> +        if (x instanceof Boolean)  return (char) (((Boolean)
> x).booleanValue() ? 1 : 0);
> +        if (x instanceof Number )  return (char)  ((Number)
> x).intValue();
>            return ((Character) x).charValue();
>        }
>
>        static long unboxLong(Object x) {
>            if (x == null)  return 0;  // never NPE
> -        return ((Long) x).longValue();
> +        if (x instanceof Boolean  )  return (long) (((Boolean)
> x).booleanValue() ? 1 : 0);
> +        if (x instanceof Character)  return (long)  ((Character)
> x).charValue();
> +        return ((Number) x).longValue();
>        }
>
>        static float unboxFloat(Object x) {
>            if (x == null)  return 0;  // never NPE
> -        return ((Float) x).floatValue();
> +        if (x instanceof Boolean  )  return (float) (((Boolean)
> x).booleanValue() ? 1 : 0);
> +        if (x instanceof Character)  return (float)  ((Character)
> x).charValue();
> +        return ((Number) x).floatValue();
>        }
>
>        static double unboxDouble(Object x) {
>            if (x == null)  return 0;  // never NPE
> -        return ((Double) x).doubleValue();
> +        if (x instanceof Boolean  )  return (double) (((Boolean)
> x).booleanValue() ? 1 : 0);
> +        if (x instanceof Character)  return (double)  ((Character)
> x).charValue();
> +        return ((Number) x).doubleValue();
>        }
>
>        /// Converting references to "raw" values.
>
> _______________________________________________
> mlvm-dev mailing list
> mlvm-dev at openjdk.java.net
> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev



More information about the mlvm-dev mailing list