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