ValueConversion.unbox* fixes(?)
Christian Thalinger
christian.thalinger at oracle.com
Fri Nov 12 03:26:33 PST 2010
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
--- /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.
More information about the mlvm-dev
mailing list