boehm.cc (_Jv_BuildGCDescr): Put first word of object in most significant bit of...
authorBryce McKinlay <bryce@mckinlay.net.nz>
Mon, 29 Sep 2003 07:13:40 +0000 (07:13 +0000)
committerBryce McKinlay <bryce@gcc.gnu.org>
Mon, 29 Sep 2003 07:13:40 +0000 (08:13 +0100)
* boehm.cc (_Jv_BuildGCDescr): Put first word of object in most
significant bit of descriptor. Include the vtable and sync_info
fields.

From-SVN: r71895

libjava/ChangeLog
libjava/boehm.cc

index b8e67b6d1224813bfe5a85db66a3ba84df81fc5e..88ed0594af0536641e38273e177c9d5ce33ab9d4 100644 (file)
@@ -1,3 +1,9 @@
+2003-09-29  Bryce McKinlay  <bryce@mckinlay.net.nz>
+
+       * boehm.cc (_Jv_BuildGCDescr): Put first word of object in most 
+       significant bit of descriptor. Include the vtable and sync_info 
+       fields.
+
 2003-09-28  Bryce McKinlay  <bryce@mckinlay.net.nz>
 
        * java/text/DateFormat.java (format): Throw IllegalArgumentException
index 95721c7fbeb39023b6d7b29d2b45631c8c341854..af5f979197d3214f68422d21747dac9d06b32f25 100644 (file)
@@ -331,12 +331,20 @@ void *
 _Jv_BuildGCDescr(jclass self)
 {
   jlong desc = 0;
+  jint bits_per_word = CHAR_BIT * sizeof (void *);
 
   // Note: for now we only consider a bitmap mark descriptor.  We
   // could also handle the case where the first N fields of a type are
   // references.  However, this is not very likely to be used by many
   // classes, and it is easier to compute things this way.
 
+  // The vtable pointer.
+  desc |= 1ULL << (bits_per_word - 1);
+#ifndef JV_HASH_SYNCHRONIZATION
+  // The sync_info field.
+  desc |= 1ULL << (bits_per_word - 2);
+#endif
+
   for (jclass klass = self; klass != NULL; klass = klass->getSuperclass())
     {
       jfieldID field = JvGetFirstInstanceField(klass);
@@ -351,13 +359,12 @@ _Jv_BuildGCDescr(jclass self)
              if (off % sizeof (void *) != 0)
                return (void *) (GCJ_DEFAULT_DESCR);
              off /= sizeof (void *);
-             // Bottom 2 bits are reserved.
-             off += 2;
              // If we find a field outside the range of our bitmap,
-             // fall back to procedure marker.
-             if (off > CHAR_BIT * sizeof (void *))
+             // fall back to procedure marker. The bottom 2 bits are
+             // reserved.
+             if (off >= bits_per_word - 2)
                return (void *) (GCJ_DEFAULT_DESCR);
-             desc |= 1ULL << off;
+             desc |= 1ULL << (bits_per_word - off - 1);
            }
 
          field = field->getNextField();