diff --git a/src/mono/mono/component/hot_reload.c b/src/mono/mono/component/hot_reload.c index 8d14eca731577c..85d1029e490dba 100644 --- a/src/mono/mono/component/hot_reload.c +++ b/src/mono/mono/component/hot_reload.c @@ -933,6 +933,7 @@ delta_info_initialize_mutants (const MonoImage *base, const BaselineInfo *base_i tbl->row_size = prev_table->row_size; tbl->size_bitfield = prev_table->size_bitfield; } + mono_metadata_compute_column_offsets (tbl); tbl->rows_ = rows; g_assert (tbl->rows_ > 0 && tbl->row_size != 0); @@ -1890,7 +1891,7 @@ apply_enclog_pass2 (Pass2Context *ctx, MonoImage *image_base, BaselineInfo *base gboolean is_addition = token_index-1 >= delta_info->count[token_table].prev_gen_rows ; *should_invalidate_transformed_code |= table_should_invalidate_transformed_code (token_table); - + mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_METADATA_UPDATE, "enclog i=%d: token=0x%08x (table=%s): %d:\t%s", i, log_token, mono_meta_table_name (token_table), func_code, (is_addition ? "ADD" : "UPDATE")); @@ -2934,7 +2935,7 @@ add_property_to_existing_class (MonoImage *image_base, BaselineInfo *base_info, parent_info->generation = generation; return prop; - + } MonoClassMetadataUpdateEvent * @@ -2962,7 +2963,7 @@ add_event_to_existing_class (MonoImage *image_base, BaselineInfo *base_info, uin parent_info->generation = generation; return evt; - + } @@ -3017,7 +3018,7 @@ add_semantic_method_to_existing_event (MonoImage *image_base, BaselineInfo *base g_assert (m_event_is_from_update (evt)); MonoMethod **dest = NULL; - + switch (semantics) { case METHOD_SEMANTIC_ADD_ON: dest = &evt->add; @@ -3425,7 +3426,7 @@ recompute_ginst_props (MonoClass *ginst, MonoClassMetadataUpdateInfo *info, for (GSList *ptr = gtd_info->added_props; ptr; ptr = ptr->next) { MonoClassMetadataUpdateProperty *gtd_added_prop = (MonoClassMetadataUpdateProperty *)ptr->data; MonoClassMetadataUpdateProperty *added_prop = mono_class_new0 (ginst, MonoClassMetadataUpdateProperty, 1); - + added_prop->prop = gtd_added_prop->prop; added_prop->token = gtd_added_prop->token; @@ -3453,7 +3454,7 @@ recompute_ginst_events (MonoClass *ginst, MonoClassMetadataUpdateInfo *info, for (GSList *ptr = gtd_info->added_events; ptr; ptr = ptr->next) { MonoClassMetadataUpdateEvent *gtd_added_event = (MonoClassMetadataUpdateEvent *)ptr->data; MonoClassMetadataUpdateEvent *added_event = mono_class_new0 (ginst, MonoClassMetadataUpdateEvent, 1); - + added_event->evt = gtd_added_event->evt; if (added_event->evt.add) @@ -3466,7 +3467,7 @@ recompute_ginst_events (MonoClass *ginst, MonoClassMetadataUpdateInfo *info, added_event->evt.raise = mono_class_inflate_generic_method_full_checked ( added_event->evt.raise, ginst, mono_class_get_context (ginst), error); mono_error_assert_ok (error); /*FIXME proper error handling*/ - + added_event->evt.parent = ginst; info->added_events = g_slist_prepend_mem_manager (m_class_get_mem_manager (ginst), info->added_events, (gpointer)added_event); @@ -3506,7 +3507,7 @@ recompute_ginst_update_info(MonoClass *ginst, MonoClass *gtd, MonoClassMetadataU { // if ginst has a `MonoClassMetadataUpdateInfo`, use it to start with, otherwise, allocate a new one MonoClassMetadataUpdateInfo *info = mono_class_get_or_add_metadata_update_info (ginst); - + if (!info) info = mono_class_new0 (ginst, MonoClassMetadataUpdateInfo, 1); @@ -3517,13 +3518,13 @@ recompute_ginst_update_info(MonoClass *ginst, MonoClass *gtd, MonoClassMetadataU recompute_ginst_events (ginst, info, gtd, gtd_info, error); mono_error_assert_ok (error); - + recompute_ginst_fields (ginst, info, gtd, gtd_info, error); mono_error_assert_ok (error); // finally, update the generation of the ginst info to the same one as the gtd info->generation = gtd_info->generation; - // we're done info is now up to date + // we're done info is now up to date } static MonoProperty * diff --git a/src/mono/mono/metadata/metadata-internals.h b/src/mono/mono/metadata/metadata-internals.h index 05934225cbd907..67c6d1350473d1 100644 --- a/src/mono/mono/metadata/metadata-internals.h +++ b/src/mono/mono/metadata/metadata-internals.h @@ -217,6 +217,8 @@ typedef struct { guint32 size; } MonoStreamHeader; +#define MONO_TABLE_INFO_MAX_COLUMNS 9 + struct _MonoTableInfo { const char *base; guint rows_ : 24; /* don't access directly, use table_info_get_rows */ @@ -234,6 +236,12 @@ struct _MonoTableInfo { * we only need 4, but 8 is aligned no shift required. */ guint32 size_bitfield; + + /* + * optimize out the loop in mono_metadata_decode_row_col_raw. + * 4 * 9 easily fits in a uint8 + */ + guint8 column_offsets[MONO_TABLE_INFO_MAX_COLUMNS]; }; #define REFERENCE_MISSING ((gpointer) -1) @@ -888,6 +896,8 @@ mono_metadata_table_bounds_check (MonoImage *image, int table_index, int token_i MONO_COMPONENT_API const char * mono_meta_table_name (int table); void mono_metadata_compute_table_bases (MonoImage *meta); +MONO_COMPONENT_API +void mono_metadata_compute_column_offsets (MonoTableInfo *table); gboolean mono_metadata_interfaces_from_typedef_full (MonoImage *image, diff --git a/src/mono/mono/metadata/metadata.c b/src/mono/mono/metadata/metadata.c index b432e7f07dc54d..d005bfdb6b6b68 100644 --- a/src/mono/mono/metadata/metadata.c +++ b/src/mono/mono/metadata/metadata.c @@ -1003,6 +1003,18 @@ mono_metadata_table_bounds_check_slow (MonoImage *image, int table_index, int to return mono_metadata_update_table_bounds_check (image, table_index, token_index); } +void +mono_metadata_compute_column_offsets (MonoTableInfo *table) +{ + int offset = 0, c = mono_metadata_table_count (table->size_bitfield); + memset(table->column_offsets, 0, MONO_TABLE_INFO_MAX_COLUMNS); + for (int i = 0; i < c; i++) { + int size = mono_metadata_table_size (table->size_bitfield, i); + table->column_offsets[i] = (guint8)offset; + offset += size; + } +} + /** * mono_metadata_compute_table_bases: * \param meta metadata context to compute table values @@ -1022,6 +1034,7 @@ mono_metadata_compute_table_bases (MonoImage *meta) continue; table->row_size = mono_metadata_compute_size (meta, i, &table->size_bitfield); + mono_metadata_compute_column_offsets (table); table->base = base; base += table_info_get_rows (table) * table->row_size; } @@ -1470,18 +1483,12 @@ mono_metadata_decode_row_col_raw (const MonoTableInfo *t, int idx, guint col) { const char *data; int n; - guint32 bitfield = t->size_bitfield; g_assert (GINT_TO_UINT32(idx) < table_info_get_rows (t)); g_assert (col < mono_metadata_table_count (bitfield)); - data = t->base + idx * t->row_size; - - n = mono_metadata_table_size (bitfield, 0); - for (guint i = 0; i < col; ++i) { - data += n; - n = mono_metadata_table_size (bitfield, i + 1); - } + data = t->base + idx * t->row_size + t->column_offsets [col]; + n = mono_metadata_table_size (bitfield, col); switch (n) { case 1: return *data; @@ -6009,7 +6016,7 @@ signature_equiv_vararg (MonoMethodSignature *sig1, MonoMethodSignature *sig2, in if (sig1->hasthis != sig2->hasthis || sig1->sentinelpos != sig2->sentinelpos) return FALSE; - + int flag = MONO_TYPE_EQ_FLAGS_SIG_ONLY | (((equiv_flags & SIG_EQUIV_FLAG_IGNORE_CMODS) != 0) ? MONO_TYPE_EQ_FLAG_IGNORE_CMODS : 0); for (i = 0; i < sig1->sentinelpos; i++) {