From cecf251e15d6d5e4410f27fcac4dac539e61f390 Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Tue, 13 May 2008 14:34:51 +0000 Subject: [PATCH] 2008-05-13 Rodrigo Kumpera * metadata.c (mono_metadata_compute_size): Correctly calculate field size for generic param and event tables. Fixes #388977. svn path=/trunk/mono/; revision=103086 --- mono/metadata/ChangeLog | 5 +++++ mono/metadata/metadata.c | 14 +++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/mono/metadata/ChangeLog b/mono/metadata/ChangeLog index c374a7e50fc..5b6bf61c7c1 100644 --- a/mono/metadata/ChangeLog +++ b/mono/metadata/ChangeLog @@ -1,3 +1,8 @@ +2008-05-13 Rodrigo Kumpera + + * metadata.c (mono_metadata_compute_size): Correctly calculate field + size for generic param and event tables. Fixes #388977. + 2008-05-13 Zoltan Varga * loader.c (mono_method_signature): Use memory barriers because of the double diff --git a/mono/metadata/metadata.c b/mono/metadata/metadata.c index 4bce9560fe6..f6bf3abb0de 100644 --- a/mono/metadata/metadata.c +++ b/mono/metadata/metadata.c @@ -538,8 +538,10 @@ mono_metadata_compute_size (MonoImage *meta, int tableindex, guint32 *result_bit break; case MONO_TABLE_EVENT: g_assert (i == 2); - field_size = MAX (idx_size (MONO_TABLE_TYPEDEF), idx_size(MONO_TABLE_TYPEREF)); - field_size = MAX (field_size, idx_size(MONO_TABLE_TYPESPEC)); + n = MAX (meta->tables [MONO_TABLE_TYPEDEF].rows, meta->tables [MONO_TABLE_TYPEREF].rows); + n = MAX (n, meta->tables [MONO_TABLE_TYPESPEC].rows); + /*This is a coded token for 3 tables, so takes 2 bits */ + field_size = rtsize (n, 16 - MONO_TYPEDEFORREF_BITS); break; case MONO_TABLE_EVENT_POINTER: g_assert (i == 0); @@ -596,9 +598,11 @@ mono_metadata_compute_size (MonoImage *meta, int tableindex, guint32 *result_bit break; case MONO_TABLE_GENERICPARAM: g_assert (i == 2 || i == 4 || i == 5); - if (i == 2) - field_size = MAX (idx_size (MONO_TABLE_METHOD), idx_size (MONO_TABLE_TYPEDEF)); - else if (i == 4) + if (i == 2) { + n = MAX (meta->tables [MONO_TABLE_METHOD].rows, meta->tables [MONO_TABLE_TYPEDEF].rows); + /*This is a coded token for 2 tables, so takes 1 bit */ + field_size = rtsize (n, 16 - MONO_TYPEORMETHOD_BITS); + } else if (i == 4) field_size = idx_size (MONO_TABLE_TYPEDEF); else if (i == 5) field_size = idx_size (MONO_TABLE_TYPEDEF); -- 2.25.1