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:
parent
5560a945d8
commit
e7c4333b11
@ -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
|
||||||
|
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user