boehm.cc (_Jv_BuildGCDescr): Put first word of object in most significant bit of descriptor.

* 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
This commit is contained in:
Bryce McKinlay 2003-09-29 07:13:40 +00:00 committed by Bryce McKinlay
parent 5560a945d8
commit e7c4333b11
2 changed files with 18 additions and 5 deletions

View 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> 2003-09-28 Bryce McKinlay <bryce@mckinlay.net.nz>
* java/text/DateFormat.java (format): Throw IllegalArgumentException * java/text/DateFormat.java (format): Throw IllegalArgumentException

View File

@ -331,12 +331,20 @@ void *
_Jv_BuildGCDescr(jclass self) _Jv_BuildGCDescr(jclass self)
{ {
jlong desc = 0; jlong desc = 0;
jint bits_per_word = CHAR_BIT * sizeof (void *);
// Note: for now we only consider a bitmap mark descriptor. We // 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 // 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 // references. However, this is not very likely to be used by many
// classes, and it is easier to compute things this way. // 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()) for (jclass klass = self; klass != NULL; klass = klass->getSuperclass())
{ {
jfieldID field = JvGetFirstInstanceField(klass); jfieldID field = JvGetFirstInstanceField(klass);
@ -351,13 +359,12 @@ _Jv_BuildGCDescr(jclass self)
if (off % sizeof (void *) != 0) if (off % sizeof (void *) != 0)
return (void *) (GCJ_DEFAULT_DESCR); return (void *) (GCJ_DEFAULT_DESCR);
off /= sizeof (void *); off /= sizeof (void *);
// Bottom 2 bits are reserved.
off += 2;
// If we find a field outside the range of our bitmap, // If we find a field outside the range of our bitmap,
// fall back to procedure marker. // fall back to procedure marker. The bottom 2 bits are
if (off > CHAR_BIT * sizeof (void *)) // reserved.
if (off >= bits_per_word - 2)
return (void *) (GCJ_DEFAULT_DESCR); return (void *) (GCJ_DEFAULT_DESCR);
desc |= 1ULL << off; desc |= 1ULL << (bits_per_word - off - 1);
} }
field = field->getNextField(); field = field->getNextField();