X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=blobdiff_plain;f=libjava%2Fboehm.cc;h=642f451f92e198cda674e9ed9f925a8a22b8b5ce;hp=8e621594bf264a86c6ee697cc92a1a88ff2b076c;hb=39c687d57d9f1542f265e51582a97fc145d2cb3f;hpb=8cbd7fa92a5189a3703f644620432fcd236f961a diff --git a/libjava/boehm.cc b/libjava/boehm.cc index 8e621594bf2..642f451f92e 100644 --- a/libjava/boehm.cc +++ b/libjava/boehm.cc @@ -206,6 +206,8 @@ _Jv_MarkObj (void *addr, void *msp, void *msl, void * /* env */) MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, c, cDlabel); p = (ptr_t) c->protectionDomain; MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, c, cPlabel); + p = (ptr_t) c->hack_signers; + MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, c, cSlabel); #ifdef INTERPRETER if (_Jv_IsInterpretedClass (c)) @@ -331,12 +333,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 +361,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 |= 1 << off; + desc |= 1ULL << (bits_per_word - off - 1); } field = field->getNextField();