[sgen] Special descriptor encoding for strings.
authorMark Probst <mark.probst@gmail.com>
Mon, 8 Sep 2014 12:26:57 +0000 (14:26 +0200)
committerMark Probst <mark.probst@gmail.com>
Wed, 26 Nov 2014 18:38:39 +0000 (10:38 -0800)
The complex pointer-free type carries no additional information.  We use its
data to mark strings so we can determine object size quicker.

mono/metadata/sgen-descriptor.c
mono/metadata/sgen-descriptor.h
mono/metadata/sgen-gc.h

index 652eca1cc4dd01da9a457857391d85b89ce57d04..33a428f2dc3ffd4251c18b03c0086e7429b6f33c 100644 (file)
@@ -122,7 +122,7 @@ sgen_get_complex_descriptor (mword desc)
 void*
 mono_gc_make_descr_for_string (gsize *bitmap, int numbits)
 {
-       return (void*) DESC_TYPE_COMPLEX_PTRFREE;
+       return (void*)SGEN_DESC_STRING;
 }
 
 void*
index 05ea342d8119448b521d929067e3d92b87ef9945..b4162620bab00a18c87bbed6e0b66863eedbfb62 100644 (file)
@@ -85,7 +85,7 @@ enum {
        DESC_TYPE_LARGE_BITMAP = 2, /* | 29-61 bitmap bits */
        DESC_TYPE_MAX_SMALL_OBJ = 2,
        DESC_TYPE_COMPLEX = 3,      /* index for bitmap into complex_descriptors */
-       DESC_TYPE_COMPLEX_PTRFREE = 4, /*Nothing, used to encode large ptr objects. */
+       DESC_TYPE_COMPLEX_PTRFREE = 4, /* Nothing, used to encode large ptr objects and strings. */
        DESC_TYPE_VECTOR = 5,       /* 10 bits element size | 1 bit kind | 2 bits desc | element desc */
        DESC_TYPE_COMPLEX_ARR = 6,  /* index for bitmap into complex_descriptors */
        DESC_TYPE_MAX = 6,
@@ -99,6 +99,8 @@ enum {
        DESC_TYPE_V_BITMAP      /* elements are as the bitmap in DESC_TYPE_SMALL_BITMAP */
 };
 
+#define SGEN_DESC_STRING       (DESC_TYPE_COMPLEX_PTRFREE | (1 << LOW_TYPE_BITS))
+
 /* Root bitmap descriptors are simpler: the lower three bits describe the type
  * and we either have 30/62 bitmap bits or nibble-based run-length,
  * or a complex descriptor, or a user defined marker function.
@@ -127,15 +129,16 @@ void sgen_descriptor_count_copied_object (mword desc) MONO_INTERNAL;
 static inline gboolean
 sgen_gc_descr_has_references (mword desc)
 {
-       /*Both string and fixed size objects are encoded using a zero run RUN_LEN*/
+       /* Small pointer-free objects are encoded using a zero run RUN_LEN */
        if ((desc & 0xffff0007) == DESC_TYPE_RUN_LENGTH)
                return FALSE;
 
-       /*The array is ptr-free*/
-       if ((desc & 0xC007) == (DESC_TYPE_VECTOR | VECTOR_SUBTYPE_PTRFREE))
+       /* Large pointer-free objects and strings */
+       if ((desc & 0x7) == DESC_TYPE_COMPLEX_PTRFREE)
                return FALSE;
 
-       if ((desc & 0x7) == DESC_TYPE_COMPLEX_PTRFREE)
+       /*The array is ptr-free*/
+       if ((desc & 0xC007) == (DESC_TYPE_VECTOR | VECTOR_SUBTYPE_PTRFREE))
                return FALSE;
 
        return TRUE;
index d00badc3eb66088764b8aae587daa26a7f3b7b4a..47ffba4577163dbaee8ac6ec0927e1c2c6be5850 100644 (file)
@@ -810,6 +810,8 @@ sgen_par_object_get_size (MonoVTable *vtable, MonoObject* o)
                mword size = descr & 0xfff8;
                SGEN_ASSERT (0, size >= sizeof (MonoObject), "Run length object size to small");
                return size;
+       } else if (descr == SGEN_DESC_STRING) {
+               return offsetof (MonoString, chars) + 2 * mono_string_length_fast ((MonoString*) o) + 2;
        } else if (type == DESC_TYPE_VECTOR) {
                int element_size = ((descr) >> VECTOR_ELSIZE_SHIFT) & MAX_ELEMENT_SIZE;
                MonoArray *array = (MonoArray*)o;