natClass.cc (_Jv_IsAssignableFrom): Ensure that ancestors table index is within allow...
authorMartin Kahlert <martin.kahlert@infineon.com>
Tue, 5 Jun 2001 09:46:36 +0000 (09:46 +0000)
committerBryce McKinlay <bryce@gcc.gnu.org>
Tue, 5 Jun 2001 09:46:36 +0000 (10:46 +0100)
2001-06-05  Martin Kahlert  <martin.kahlert@infineon.com>
    Bryce McKinlay  <bryce@waitaki.otago.ac.nz>

* java/lang/natClass.cc (_Jv_IsAssignableFrom): Ensure that ancestors
table index is within allowed bounds. Ensure that we dont try to access
class itable at a negative offset. Avoid an ancestor table lookup if
source is a primitive type class.
(isInstance): Remove redundant isPrimitive() check.

Co-Authored-By: Bryce McKinlay <bryce@waitaki.otago.ac.nz>
From-SVN: r42898

libjava/ChangeLog
libjava/java/lang/natClass.cc

index 66c657f46fb25831efeda46a769ed9eb5ab7d3d8..bf981ef59463960a9cfa7a976cdd265efde3c6ec 100644 (file)
@@ -1,3 +1,12 @@
+2001-06-05  Martin Kahlert  <martin.kahlert@infineon.com>
+           Bryce McKinlay  <bryce@waitaki.otago.ac.nz>
+
+       * java/lang/natClass.cc (_Jv_IsAssignableFrom): Ensure that ancestors
+       table index is within allowed bounds. Ensure that we dont try to access
+       class itable at a negative offset. Avoid an ancestor table lookup if
+       source is a primitive type class.
+       (isInstance): Remove redundant isPrimitive() check.
+
 2001-06-04  Tom Tromey  <tromey@redhat.com>
 
        * java/security/PublicKey.java: Extend Key.
index e88bd8309676f2c8640ea9e291aecf30a2be2946..d6fb3ab7d85f028fce32d82ab2dc4d9218ed6bf9 100644 (file)
@@ -633,7 +633,7 @@ java::lang::Class::isAssignableFrom (jclass klass)
 jboolean
 java::lang::Class::isInstance (jobject obj)
 {
-  if (__builtin_expect (! obj || isPrimitive (), false))
+  if (! obj)
     return false;
   _Jv_InitClass (this);
   return _Jv_IsAssignableFrom (this, JV_CLASS (obj));
@@ -939,19 +939,29 @@ _Jv_IsAssignableFrom (jclass target, jclass source)
       if (cl_iindex < if_idt->iface.ioffsets[0])
         {
          jshort offset = if_idt->iface.ioffsets[cl_iindex];
-         if (offset < cl_idt->cls.itable_length
+         if (offset != -1 && offset < cl_idt->cls.itable_length
              && cl_idt->cls.itable[offset] == target)
            return true;
        }
       return false;
     }
      
-  if ((target == &ObjectClass && !source->isPrimitive())
-      || (source->ancestors != NULL 
-         && source->ancestors[source->depth - target->depth] == target))
+  // Primitive TYPE classes are only assignable to themselves.
+  if (__builtin_expect (target->isPrimitive(), false))
+    return false;
+    
+  if (target == &ObjectClass)
+    {
+      if (source->isPrimitive())
+        return false;
+      return true;
+    }
+  else if (source->ancestors != NULL 
+           && source->depth >= target->depth
+          && source->ancestors[source->depth - target->depth] == target)
     return true;
       
- return false;
 return false;
 }
 
 // Interface type checking, the slow way. Returns TRUE if IFACE is a