Skip to content

Commit f22794c

Browse files
committed
[metadata] Don't access MonoTableInfo:rows, use table_info_get_rows()
Rename the field to rows_. Also updated some bounds checks to use mono_metadata_table_bounds_check (which is metadata-update aware) where the subsequent lookups go through the metadata decode functions and should just work with metadata-update. Added FIXME: metadata-update in cases where the table row size is assumed to be fixed or is used as a sentinel value, or where the decoding may depend on sorting properties that metadata updates probably won't uphold.
1 parent dd61f0c commit f22794c

17 files changed

+338
-222
lines changed

src/mono/mono/metadata/assembly.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -653,7 +653,7 @@ mono_assembly_fill_assembly_name_full (MonoImage *image, MonoAssemblyName *aname
653653
guint32 cols [MONO_ASSEMBLY_SIZE];
654654
gint32 machine, flags;
655655

656-
if (!t->rows)
656+
if (!table_info_get_rows (t))
657657
return FALSE;
658658

659659
mono_metadata_decode_row (t, 0, cols, MONO_ASSEMBLY_SIZE);
@@ -1237,8 +1237,9 @@ mono_assembly_load_reference (MonoImage *image, int index)
12371237
if (!image->references) {
12381238
MonoTableInfo *t = &image->tables [MONO_TABLE_ASSEMBLYREF];
12391239

1240-
image->references = g_new0 (MonoAssembly *, t->rows + 1);
1241-
image->nreferences = t->rows;
1240+
int n = table_info_get_rows (t);
1241+
image->references = g_new0 (MonoAssembly *, n + 1);
1242+
image->nreferences = n;
12421243
}
12431244
reference = image->references [index];
12441245
mono_image_unlock (image);
@@ -2334,7 +2335,7 @@ mono_assembly_request_load_from (MonoImage *image, const char *fname,
23342335
predicate = req->predicate;
23352336
user_data = req->predicate_ud;
23362337

2337-
if (!image->tables [MONO_TABLE_ASSEMBLY].rows) {
2338+
if (!table_info_get_rows (&image->tables [MONO_TABLE_ASSEMBLY])) {
23382339
/* 'image' doesn't have a manifest -- maybe someone is trying to Assembly.Load a .netmodule */
23392340
*status = MONO_IMAGE_IMAGE_INVALID;
23402341
return NULL;
@@ -3685,7 +3686,8 @@ mono_assembly_has_skip_verification (MonoAssembly *assembly)
36853686

36863687
t = &assembly->image->tables [MONO_TABLE_DECLSECURITY];
36873688

3688-
for (i = 0; i < t->rows; ++i) {
3689+
int rows = table_info_get_rows (t);
3690+
for (i = 0; i < rows; ++i) {
36893691
mono_metadata_decode_row (t, i, cols, MONO_DECL_SECURITY_SIZE);
36903692
if ((cols [MONO_DECL_SECURITY_PARENT] & MONO_HAS_DECL_SECURITY_MASK) != MONO_HAS_DECL_SECURITY_ASSEMBLY)
36913693
continue;

src/mono/mono/metadata/class-init.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,8 @@ mono_class_create_from_typedef (MonoImage *image, guint32 type_token, MonoError
433433

434434
error_init (error);
435435

436-
if (mono_metadata_token_table (type_token) != MONO_TABLE_TYPEDEF || tidx > tt->rows) {
436+
/* FIXME: metadata-update - this function needs extensive work */
437+
if (mono_metadata_token_table (type_token) != MONO_TABLE_TYPEDEF || tidx > table_info_get_rows (tt)) {
437438
mono_error_set_bad_image (error, image, "Invalid typedef token %x", type_token);
438439
return NULL;
439440
}
@@ -620,19 +621,19 @@ mono_class_create_from_typedef (MonoImage *image, guint32 type_token, MonoError
620621
first_method_idx = cols [MONO_TYPEDEF_METHOD_LIST] - 1;
621622
mono_class_set_first_method_idx (klass, first_method_idx);
622623

623-
if (tt->rows > tidx){
624+
if (table_info_get_rows (tt) > tidx){
624625
mono_metadata_decode_row (tt, tidx, cols_next, MONO_TYPEDEF_SIZE);
625626
field_last = cols_next [MONO_TYPEDEF_FIELD_LIST] - 1;
626627
method_last = cols_next [MONO_TYPEDEF_METHOD_LIST] - 1;
627628
} else {
628-
field_last = image->tables [MONO_TABLE_FIELD].rows;
629-
method_last = image->tables [MONO_TABLE_METHOD].rows;
629+
field_last = table_info_get_rows (&image->tables [MONO_TABLE_FIELD]);
630+
method_last = table_info_get_rows (&image->tables [MONO_TABLE_METHOD]);
630631
}
631632

632633
if (cols [MONO_TYPEDEF_FIELD_LIST] &&
633-
cols [MONO_TYPEDEF_FIELD_LIST] <= image->tables [MONO_TABLE_FIELD].rows)
634+
cols [MONO_TYPEDEF_FIELD_LIST] <= table_info_get_rows (&image->tables [MONO_TABLE_FIELD]))
634635
mono_class_set_field_count (klass, field_last - first_field_idx);
635-
if (cols [MONO_TYPEDEF_METHOD_LIST] <= image->tables [MONO_TABLE_METHOD].rows)
636+
if (cols [MONO_TYPEDEF_METHOD_LIST] <= table_info_get_rows (&image->tables [MONO_TABLE_METHOD]))
636637
mono_class_set_method_count (klass, method_last - first_method_idx);
637638

638639
/* reserve space to store vector pointer in arrays */

src/mono/mono/metadata/class.c

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2678,13 +2678,14 @@ mono_class_name_from_token (MonoImage *image, guint32 type_token)
26782678

26792679
switch (type_token & 0xff000000){
26802680
case MONO_TOKEN_TYPE_DEF: {
2681-
guint32 cols [MONO_TYPEDEF_SIZE];
2682-
MonoTableInfo *tt = &image->tables [MONO_TABLE_TYPEDEF];
26832681
guint tidx = mono_metadata_token_index (type_token);
26842682

2685-
if (tidx > tt->rows)
2683+
if (mono_metadata_table_bounds_check (image, MONO_TABLE_TYPEDEF, tidx))
26862684
return g_strdup_printf ("Invalid type token 0x%08x", type_token);
26872685

2686+
guint32 cols [MONO_TYPEDEF_SIZE];
2687+
MonoTableInfo *tt = &image->tables [MONO_TABLE_TYPEDEF];
2688+
26882689
mono_metadata_decode_row (tt, tidx - 1, cols, MONO_TYPEDEF_SIZE);
26892690
name = mono_metadata_string_heap (image, cols [MONO_TYPEDEF_NAME]);
26902691
nspace = mono_metadata_string_heap (image, cols [MONO_TYPEDEF_NAMESPACE]);
@@ -2695,13 +2696,14 @@ mono_class_name_from_token (MonoImage *image, guint32 type_token)
26952696
}
26962697

26972698
case MONO_TOKEN_TYPE_REF: {
2698-
guint32 cols [MONO_TYPEREF_SIZE];
2699-
MonoTableInfo *t = &image->tables [MONO_TABLE_TYPEREF];
27002699
guint tidx = mono_metadata_token_index (type_token);
27012700

2702-
if (tidx > t->rows)
2701+
if (mono_metadata_table_bounds_check (image, MONO_TABLE_TYPEREF, tidx))
27032702
return g_strdup_printf ("Invalid type token 0x%08x", type_token);
27042703

2704+
guint32 cols [MONO_TYPEREF_SIZE];
2705+
MonoTableInfo *t = &image->tables [MONO_TABLE_TYPEREF];
2706+
27052707
mono_metadata_decode_row (t, tidx-1, cols, MONO_TYPEREF_SIZE);
27062708
name = mono_metadata_string_heap (image, cols [MONO_TYPEREF_NAME]);
27072709
nspace = mono_metadata_string_heap (image, cols [MONO_TYPEREF_NAMESPACE]);
@@ -2738,7 +2740,7 @@ mono_assembly_name_from_token (MonoImage *image, guint32 type_token)
27382740
MonoTableInfo *t = &image->tables [MONO_TABLE_TYPEREF];
27392741
guint32 idx = mono_metadata_token_index (type_token);
27402742

2741-
if (idx > t->rows)
2743+
if (mono_metadata_table_bounds_check (image, MONO_TABLE_TYPEREF, idx))
27422744
return g_strdup_printf ("Invalid type token 0x%08x", type_token);
27432745

27442746
mono_metadata_decode_row (t, idx-1, cols, MONO_TYPEREF_SIZE);
@@ -2973,7 +2975,9 @@ mono_image_init_name_cache (MonoImage *image)
29732975
/* Temporary hash table to avoid lookups in the nspace_table */
29742976
name_cache2 = g_hash_table_new (NULL, NULL);
29752977

2976-
for (i = 1; i <= t->rows; ++i) {
2978+
/* FIXME: metadata-update */
2979+
int rows = table_info_get_rows (t);
2980+
for (i = 1; i <= rows; ++i) {
29772981
mono_metadata_decode_row (t, i - 1, cols, MONO_TYPEDEF_SIZE);
29782982
visib = cols [MONO_TYPEDEF_FLAGS] & TYPE_ATTRIBUTE_VISIBILITY_MASK;
29792983
/*
@@ -3002,7 +3006,8 @@ mono_image_init_name_cache (MonoImage *image)
30023006
guint32 cols [MONO_EXP_TYPE_SIZE];
30033007
int i;
30043008

3005-
for (i = 0; i < t->rows; ++i) {
3009+
rows = table_info_get_rows (t);
3010+
for (i = 0; i < rows; ++i) {
30063011
mono_metadata_decode_row (t, i, cols, MONO_EXP_TYPE_SIZE);
30073012

30083013
guint32 impl = cols [MONO_EXP_TYPE_IMPLEMENTATION];
@@ -3191,7 +3196,8 @@ search_modules (MonoImage *image, const char *name_space, const char *name, gboo
31913196
* Note: image->modules contains the contents of the MODULEREF table, while
31923197
* the real module list is in the FILE table.
31933198
*/
3194-
for (i = 0; i < file_table->rows; i++) {
3199+
int rows = table_info_get_rows (file_table);
3200+
for (i = 0; i < rows; i++) {
31953201
guint32 cols [MONO_FILE_SIZE];
31963202
mono_metadata_decode_row (file_table, i, cols, MONO_FILE_SIZE);
31973203
if (cols [MONO_FILE_FLAGS] == FILE_CONTAINS_NO_METADATA)
@@ -3244,7 +3250,7 @@ mono_class_from_name_checked_aux (MonoImage *image, const char* name_space, cons
32443250

32453251
/* FIXME: get_class_from_name () can't handle types in the EXPORTEDTYPE table */
32463252
// The AOT cache in get_class_from_name is case-sensitive, so don't bother with it for case-insensitive lookups
3247-
if (get_class_from_name && image->tables [MONO_TABLE_EXPORTEDTYPE].rows == 0 && case_sensitive) {
3253+
if (get_class_from_name && table_info_get_rows (&image->tables [MONO_TABLE_EXPORTEDTYPE]) == 0 && case_sensitive) {
32483254
gboolean res = get_class_from_name (image, name_space, name, &klass);
32493255
if (res) {
32503256
if (!klass) {

src/mono/mono/metadata/coree.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ BOOL STDMETHODCALLTYPE _CorDllMain(HINSTANCE hInst, DWORD dwReason, LPVOID lpRes
119119
* loader trampolines should be used and assembly loading should
120120
* probably be delayed until the first call to an exported function.
121121
*/
122-
if (image->tables [MONO_TABLE_ASSEMBLY].rows && image->image_info->cli_cli_header.ch_vtable_fixups.rva) {
122+
if (table_info_get_rows (&image->tables [MONO_TABLE_ASSEMBLY]) && image->image_info->cli_cli_header.ch_vtable_fixups.rva) {
123123
MonoAssemblyOpenRequest req;
124124
mono_assembly_request_prepare_open (&req, MONO_ASMCTX_DEFAULT, alc);
125125
assembly = mono_assembly_request_open (file_name, &req, NULL);

src/mono/mono/metadata/custom-attrs.c

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1623,14 +1623,16 @@ mono_custom_attrs_from_index_checked (MonoImage *image, guint32 idx, gboolean ig
16231623
error_init (error);
16241624

16251625
ca = &image->tables [MONO_TABLE_CUSTOMATTRIBUTE];
1626+
/* FIXME: metadata-update */
1627+
int rows = table_info_get_rows (ca);
16261628

16271629
i = mono_metadata_custom_attrs_from_index (image, idx);
16281630
if (!i)
16291631
return NULL;
16301632
i --;
16311633
// initial size chosen arbitrarily, but default is 16 which is rather small
16321634
attr_array = g_array_sized_new (TRUE, TRUE, sizeof (guint32), 128);
1633-
while (i < ca->rows) {
1635+
while (i < rows) {
16341636
if (mono_metadata_decode_row_col (ca, i, MONO_CUSTOM_ATTR_PARENT) != idx)
16351637
break;
16361638
attr_array = g_array_append_val (attr_array, i);
@@ -1978,14 +1980,16 @@ mono_custom_attrs_from_param_checked (MonoMethod *method, guint32 param, MonoErr
19781980
return NULL;
19791981
ca = &image->tables [MONO_TABLE_METHOD];
19801982

1983+
/* FIXME: metadata-update */
19811984
param_list = mono_metadata_decode_row_col (ca, method_index - 1, MONO_METHOD_PARAMLIST);
1982-
if (method_index == ca->rows) {
1983-
ca = &image->tables [MONO_TABLE_PARAM];
1984-
param_last = ca->rows + 1;
1985+
int rows = table_info_get_rows (ca);
1986+
if (method_index == rows) {
1987+
param_last = rows + 1;
19851988
} else {
19861989
param_last = mono_metadata_decode_row_col (ca, method_index, MONO_METHOD_PARAMLIST);
1987-
ca = &image->tables [MONO_TABLE_PARAM];
19881990
}
1991+
ca = &image->tables [MONO_TABLE_PARAM];
1992+
19891993
found = FALSE;
19901994
for (i = param_list; i < param_last; ++i) {
19911995
param_pos = mono_metadata_decode_row_col (ca, i - 1, MONO_PARAM_SEQUENCE);
@@ -2345,7 +2349,7 @@ custom_attr_class_name_from_methoddef (MonoImage *image, guint32 method_token, c
23452349
guint32 cols [MONO_TYPEDEF_SIZE];
23462350
guint tidx = mono_metadata_token_index (type_token);
23472351

2348-
if (mono_metadata_token_table (type_token) != MONO_TABLE_TYPEDEF || tidx > tt->rows) {
2352+
if (mono_metadata_token_table (type_token) != MONO_TABLE_TYPEDEF || mono_metadata_table_bounds_check (image, MONO_TABLE_TYPEDEF, tidx)) {
23492353
/* "Invalid typedef token %x", type_token */
23502354
return FALSE;
23512355
}
@@ -2485,7 +2489,8 @@ metadata_foreach_custom_attr_from_index (MonoImage *image, guint32 idx, MonoAsse
24852489
return;
24862490
i --;
24872491
gboolean stop_iterating = FALSE;
2488-
while (!stop_iterating && i < ca->rows) {
2492+
int rows = table_info_get_rows (ca);
2493+
while (!stop_iterating && i < rows) {
24892494
if (mono_metadata_decode_row_col (ca, i, MONO_CUSTOM_ATTR_PARENT) != idx)
24902495
break;
24912496
mono_metadata_decode_row (ca, i, cols, MONO_CUSTOM_ATTR_SIZE);
@@ -2600,7 +2605,8 @@ init_weak_fields_inner (MonoImage *image, GHashTable *indexes)
26002605

26012606
tdef = &image->tables [MONO_TABLE_CUSTOMATTRIBUTE];
26022607
guint32 parent, field_idx, col, mtoken, idx;
2603-
for (int i = 0; i < tdef->rows; ++i) {
2608+
int rows = table_info_get_rows (tdef);
2609+
for (int i = 0; i < rows; ++i) {
26042610
parent = mono_metadata_decode_row_col (tdef, i, MONO_CUSTOM_ATTR_PARENT);
26052611
if ((parent & MONO_CUSTOM_ATTR_MASK) != MONO_CUSTOM_ATTR_FIELDDEF)
26062612
continue;
@@ -2616,13 +2622,16 @@ init_weak_fields_inner (MonoImage *image, GHashTable *indexes)
26162622
}
26172623
}
26182624
} else {
2625+
/* FIXME: metadata-update */
2626+
26192627
/* Memberref pointing to a typeref */
26202628
tdef = &image->tables [MONO_TABLE_MEMBERREF];
26212629

26222630
/* Check whenever the assembly references the WeakAttribute type */
26232631
gboolean found = FALSE;
26242632
tdef = &image->tables [MONO_TABLE_TYPEREF];
2625-
for (int i = 0; i < tdef->rows; ++i) {
2633+
int rows = table_info_get_rows (tdef);
2634+
for (int i = 0; i < rows; ++i) {
26262635
guint32 string_offset = mono_metadata_decode_row_col (tdef, i, MONO_TYPEREF_NAME);
26272636
const char *name = mono_metadata_string_heap (image, string_offset);
26282637
if (!strcmp (name, "WeakAttribute")) {
@@ -2636,7 +2645,8 @@ init_weak_fields_inner (MonoImage *image, GHashTable *indexes)
26362645

26372646
/* Find the memberref pointing to a typeref */
26382647
tdef = &image->tables [MONO_TABLE_MEMBERREF];
2639-
for (int i = 0; i < tdef->rows; ++i) {
2648+
rows = table_info_get_rows (tdef);
2649+
for (int i = 0; i < rows; ++i) {
26402650
guint32 cols [MONO_MEMBERREF_SIZE];
26412651
const char *sig;
26422652

@@ -2686,7 +2696,8 @@ init_weak_fields_inner (MonoImage *image, GHashTable *indexes)
26862696

26872697
tdef = &image->tables [MONO_TABLE_CUSTOMATTRIBUTE];
26882698
guint32 parent, field_idx, col, mtoken, idx;
2689-
for (int i = 0; i < tdef->rows; ++i) {
2699+
rows = table_info_get_rows (tdef);
2700+
for (int i = 0; i < rows; ++i) {
26902701
parent = mono_metadata_decode_row_col (tdef, i, MONO_CUSTOM_ATTR_PARENT);
26912702
if ((parent & MONO_CUSTOM_ATTR_MASK) != MONO_CUSTOM_ATTR_FIELDDEF)
26922703
continue;

src/mono/mono/metadata/debug-mono-ppdb.c

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ mono_ppdb_load_file (MonoImage *image, const guint8 *raw_contents, int size)
158158
int ppdb_size = 0, ppdb_compressed_size = 0;
159159
gboolean is_embedded_ppdb = FALSE;
160160

161-
if (image->tables [MONO_TABLE_DOCUMENT].rows) {
161+
if (table_info_get_rows (&image->tables [MONO_TABLE_DOCUMENT])) {
162162
/* Embedded ppdb */
163163
mono_image_addref (image);
164164
return create_ppdb_file (image, TRUE);
@@ -490,16 +490,16 @@ mono_ppdb_get_seq_points (MonoDebugMethodInfo *minfo, char **source_file, GPtrAr
490490
if (source_files)
491491
sindexes = g_ptr_array_new ();
492492

493-
if (!method->token || tables [MONO_TABLE_METHODBODY].rows == 0)
493+
if (!method->token || table_info_get_rows (&tables [MONO_TABLE_METHODBODY]) == 0)
494494
return;
495495

496496
method_idx = mono_metadata_token_index (method->token);
497497

498498
MonoTableInfo *methodbody_table = &tables [MONO_TABLE_METHODBODY];
499-
if (G_UNLIKELY (method_idx - 1 >= methodbody_table->rows)) {
499+
if (G_UNLIKELY (method_idx - 1 >= table_info_get_rows (methodbody_table))) {
500500
char *method_name = mono_method_full_name (method, FALSE);
501501
g_error ("Method idx %d is greater than number of rows (%d) in PPDB MethodDebugInformation table, for method %s in '%s'. Likely a malformed PDB file.",
502-
method_idx - 1, methodbody_table->rows, method_name, image->name);
502+
method_idx - 1, table_info_get_rows (methodbody_table), method_name, image->name);
503503
g_free (method_name);
504504
}
505505
mono_metadata_decode_row (methodbody_table, method_idx - 1, cols, MONO_METHODBODY_SIZE);
@@ -641,7 +641,8 @@ mono_ppdb_lookup_locals (MonoDebugMethodInfo *minfo)
641641
// this endpoint becomes locals_end_idx below
642642

643643
// March to the last scope that is in this method
644-
while (scope_idx <= tables [MONO_TABLE_LOCALSCOPE].rows) {
644+
int rows = table_info_get_rows (&tables [MONO_TABLE_LOCALSCOPE]);
645+
while (scope_idx <= rows) {
645646
mono_metadata_decode_row (&tables [MONO_TABLE_LOCALSCOPE], scope_idx-1, cols, MONO_LOCALSCOPE_SIZE);
646647
if (cols [MONO_LOCALSCOPE_METHOD] != method_idx)
647648
break;
@@ -654,8 +655,8 @@ mono_ppdb_lookup_locals (MonoDebugMethodInfo *minfo)
654655
// Ends with "the last row of the LocalVariable table"
655656
// this happens if the above loop marched one past the end
656657
// of the rows
657-
if (scope_idx > tables [MONO_TABLE_LOCALSCOPE].rows) {
658-
locals_end_idx = tables [MONO_TABLE_LOCALVARIABLE].rows + 1;
658+
if (scope_idx > table_info_get_rows (&tables [MONO_TABLE_LOCALSCOPE])) {
659+
locals_end_idx = table_info_get_rows (&tables [MONO_TABLE_LOCALVARIABLE]) + 1;
659660
} else {
660661
// Ends with "the next run of LocalVariables,
661662
// found by inspecting the VariableList of the next row in this LocalScope table."
@@ -674,8 +675,8 @@ mono_ppdb_lookup_locals (MonoDebugMethodInfo *minfo)
674675
mono_metadata_decode_row (&tables [MONO_TABLE_LOCALSCOPE], scope_idx-1, cols, MONO_LOCALSCOPE_SIZE);
675676

676677
locals_idx = cols [MONO_LOCALSCOPE_VARIABLELIST];
677-
if (scope_idx == tables [MONO_TABLE_LOCALSCOPE].rows) {
678-
locals_end_idx = tables [MONO_TABLE_LOCALVARIABLE].rows + 1;
678+
if (scope_idx == table_info_get_rows (&tables [MONO_TABLE_LOCALSCOPE])) {
679+
locals_end_idx = table_info_get_rows (&tables [MONO_TABLE_LOCALVARIABLE]) + 1;
679680
} else {
680681
locals_end_idx = mono_metadata_decode_row_col (&tables [MONO_TABLE_LOCALSCOPE], scope_idx-1 + 1, MONO_LOCALSCOPE_VARIABLELIST);
681682
}
@@ -756,15 +757,16 @@ lookup_custom_debug_information (MonoImage* image, guint32 token, uint8_t parent
756757
loc.col_idx = MONO_CUSTOMDEBUGINFORMATION_PARENT;
757758
loc.t = table;
758759

759-
if (!mono_binary_search (&loc, table->base, table->rows, table->row_size, table_locator))
760+
if (!mono_binary_search (&loc, table->base, table_info_get_rows (table), table->row_size, table_locator))
760761
return NULL;
761762
// Great we found one of possibly many CustomDebugInformations of this entity they are distinguished by KIND guid
762763
// First try on this index found by binary search...(it's most likeley to be only one and binary search found the one we want)
763764
if (compare_guid (guid, (guint8*)mono_metadata_guid_heap (image, mono_metadata_decode_row_col (table, loc.result, MONO_CUSTOMDEBUGINFORMATION_KIND))))
764765
return mono_metadata_blob_heap (image, mono_metadata_decode_row_col (table, loc.result, MONO_CUSTOMDEBUGINFORMATION_VALUE));
765766

766767
// Move forward from binary found index, until parent token differs
767-
for (int i = loc.result + 1; i < table->rows; i++)
768+
int rows = table_info_get_rows (table);
769+
for (int i = loc.result + 1; i < rows; i++)
768770
{
769771
if (mono_metadata_decode_row_col (table, i, MONO_CUSTOMDEBUGINFORMATION_PARENT) != loc.idx)
770772
break;

0 commit comments

Comments
 (0)