OSDN Git Service

* boehm.cc (_Jv_BuildGCDescr): Wrote.
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 23 Jul 2003 09:53:53 +0000 (09:53 +0000)
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 23 Jul 2003 09:53:53 +0000 (09:53 +0000)
Include limits.h.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@69700 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/ChangeLog
libjava/boehm.cc

index cad0018..cf97e58 100644 (file)
@@ -1,5 +1,10 @@
 2003-07-22  Tom Tromey  <tromey@redhat.com>
 
+       * boehm.cc (_Jv_BuildGCDescr): Wrote.
+       Include limits.h.
+
+2003-07-22  Tom Tromey  <tromey@redhat.com>
+
        * java/awt/Window.java (getWarningString): Just return the
        string.
        (Window): Set warningString; check with security manager.
index 5006059..8e62159 100644 (file)
@@ -1,6 +1,6 @@
 // boehm.cc - interface between libjava and Boehm GC.
 
-/* Copyright (C) 1998, 1999, 2000, 2001, 2002  Free Software Foundation
+/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003  Free Software Foundation
 
    This file is part of libgcj.
 
@@ -11,6 +11,7 @@ details.  */
 #include <config.h>
 
 #include <stdio.h>
+#include <limits.h>
 
 #include <jvm.h>
 #include <gcj/cni.h>
@@ -325,11 +326,48 @@ _Jv_MarkArray (void *addr, void *msp, void *msl, void * /*env*/)
 // since another one could be registered first.  But the compiler also
 // knows this, so in that case everything else will break, too.
 #define GCJ_DEFAULT_DESCR GC_MAKE_PROC(GC_GCJ_RESERVED_MARK_PROC_INDEX,0)
+
 void *
-_Jv_BuildGCDescr(jclass)
+_Jv_BuildGCDescr(jclass self)
 {
-  /* FIXME: We should really look at the class and build the descriptor. */
-  return (void *)(GCJ_DEFAULT_DESCR);
+  jlong desc = 0;
+
+  // 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.
+
+  for (jclass klass = self; klass != NULL; klass = klass->getSuperclass())
+    {
+      jfieldID field = JvGetFirstInstanceField(klass);
+      int count = JvNumInstanceFields(klass);
+
+      for (int i = 0; i < count; ++i)
+       {
+         if (field->isRef())
+           {
+             unsigned int off = field->getOffset();
+             // If we run into a weird situation, we bail.
+             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 *))
+               return (void *) (GCJ_DEFAULT_DESCR);
+             desc |= 1 << off;
+           }
+
+         field = field->getNextField();
+       }
+    }
+
+  // For bitmap mark type, bottom bits are 01.
+  desc |= 1;
+  // Bogus warning avoidance (on many platforms).
+  return (void *) (unsigned long) desc;
 }
 
 // Allocate some space that is known to be pointer-free.