[runtime] Fix the computation of token sizes in ppdb files, the PDB stream has an...
authorZoltan Varga <vargaz@gmail.com>
Fri, 3 Feb 2017 12:43:14 +0000 (07:43 -0500)
committerGitHub <noreply@github.com>
Fri, 3 Feb 2017 12:43:14 +0000 (07:43 -0500)
mono/metadata/image.c
mono/metadata/metadata-internals.h
mono/metadata/metadata.c

index 504b64294e0c053a002d038563ab131cbfc487e9..c9b9081966c9182897420a3c508a90d92b3458e1 100644 (file)
@@ -594,6 +594,23 @@ load_tables (MonoImage *image)
        /* They must be the same */
        g_assert ((const void *) image->tables_base == (const void *) rows);
 
+       if (image->heap_pdb.size) {
+               /*
+                * Obtain token sizes from the pdb stream.
+                */
+               /* 24 = guid + entry point */
+               int pos = 24;
+               image->referenced_tables = read64 (image->heap_pdb.data + pos);
+               pos += 8;
+               image->referenced_table_rows = g_new0 (int, 64);
+               for (int i = 0; i < 64; ++i) {
+                       if (image->referenced_tables & ((guint64)1 << i)) {
+                               image->referenced_table_rows [i] = read32 (image->heap_pdb.data + pos);
+                               pos += 4;
+                       }
+               }
+       }
+
        mono_metadata_compute_table_bases (image);
        return TRUE;
 }
index 60b34a1880dafa4d034cb0a2675b276bce4ac90c..ae524c9f35164b83d38898cbae52b152d5900a3c 100644 (file)
@@ -248,6 +248,10 @@ struct _MonoImage {
                            
        const char          *tables_base;
 
+       /* For PPDB files */
+       guint64 referenced_tables;
+       int *referenced_table_rows;
+
        /**/
        MonoTableInfo        tables [MONO_TABLE_NUM];
 
index 6301a73c74c305a982f6d00b030e29102121fbb3..3d76585b5cfbfac2be79b19cc743d94abd1b6d17 100644 (file)
@@ -555,13 +555,19 @@ inverse of this mapping.
 static inline int
 idx_size (MonoImage *meta, int tableidx)
 {
-       return meta->tables [tableidx].rows < 65536 ? 2 : 4;
+       if (meta->referenced_tables && (meta->referenced_tables & ((guint64)1 << tableidx)))
+               return meta->referenced_table_rows [tableidx] < 65536 ? 2 : 4;
+       else
+               return meta->tables [tableidx].rows < 65536 ? 2 : 4;
 }
 
 static inline int
 get_nrows (MonoImage *meta, int tableidx)
 {
-       return meta->tables [tableidx].rows;
+       if (meta->referenced_tables && (meta->referenced_tables & ((guint64)1 << tableidx)))
+               return meta->referenced_table_rows [tableidx];
+       else
+               return meta->tables [tableidx].rows;
 }
 
 /* Reference: Partition II - 23.2.6 */