Skip to content

Commit 2934993

Browse files
committed
make mono_class_get_property_token work for added props
1 parent fbcd1b2 commit 2934993

File tree

10 files changed

+57
-2
lines changed

10 files changed

+57
-2
lines changed

src/libraries/System.Runtime.Loader/tests/ApplyUpdateTest.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,16 @@ public static void TestAddInstanceField()
380380

381381
Assert.Equal("abcdTest", x2.GetStringProp);
382382

383+
var addedPropToken = propInfo.MetadataToken;
384+
385+
Assert.True (addedPropToken > 0);
386+
387+
// we don't know exactly what token Roslyn will assign to the added property, but
388+
// since the AddInstanceField.dll assembly is relatively small, assume that the
389+
// total number of properties in the updated generation is less than 64 and the
390+
// token is in that range. If more code is added, revise this test.
391+
392+
Assert.True ((addedPropToken & 0x00ffffff) < 64);
383393

384394
});
385395
}

src/mono/mono/component/hot_reload-stub.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,9 @@ hot_reload_stub_added_field_ldflda (MonoObject *instance, MonoType *field_type,
119119
static MonoProperty *
120120
hot_reload_stub_added_properties_iter (MonoClass *klass, gpointer *iter);
121121

122+
static uint32_t
123+
hot_reload_stub_get_property_idx (MonoProperty *prop);
124+
122125
static MonoComponentHotReload fn_table = {
123126
{ MONO_COMPONENT_ITF_VERSION, &hot_reload_stub_available },
124127
&hot_reload_stub_set_fastpath_data,
@@ -155,6 +158,7 @@ static MonoComponentHotReload fn_table = {
155158
&hot_reload_stub_get_method_params,
156159
&hot_reload_stub_added_field_ldflda,
157160
&hot_reload_stub_added_properties_iter,
161+
&hot_reload_stub_get_property_idx,
158162
};
159163

160164
static bool
@@ -373,6 +377,12 @@ hot_reload_stub_added_properties_iter (MonoClass *klass, gpointer *iter)
373377
return NULL;
374378
}
375379

380+
static uint32_t
381+
hot_reload_stub_get_property_idx (MonoProperty *prop)
382+
{
383+
return 0;
384+
}
385+
376386

377387
MONO_COMPONENT_EXPORT_ENTRYPOINT
378388
MonoComponentHotReload *

src/mono/mono/component/hot_reload.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,10 @@ hot_reload_added_field_ldflda (MonoObject *instance, MonoType *field_type, uint3
153153
static MonoProperty *
154154
hot_reload_added_properties_iter (MonoClass *klass, gpointer *iter);
155155

156+
static uint32_t
157+
hot_reload_get_property_idx (MonoProperty *prop);
158+
159+
156160
static MonoClassMetadataUpdateField *
157161
metadata_update_field_setup_basic_info (MonoImage *image_base, BaselineInfo *base_info, uint32_t generation, DeltaInfo *delta_info, MonoClass *parent_klass, uint32_t fielddef_token, uint32_t field_flags);
158162

@@ -201,6 +205,7 @@ static MonoComponentHotReload fn_table = {
201205
&hot_reload_get_method_params,
202206
&hot_reload_added_field_ldflda,
203207
&hot_reload_added_properties_iter,
208+
&hot_reload_get_property_idx,
204209
};
205210

206211
MonoComponentHotReload *
@@ -3449,3 +3454,11 @@ hot_reload_added_properties_iter (MonoClass *klass, gpointer *iter)
34493454
*iter = GUINT_TO_POINTER (idx);
34503455
return &prop->prop;
34513456
}
3457+
3458+
uint32_t
3459+
hot_reload_get_property_idx (MonoProperty *prop)
3460+
{
3461+
g_assert (m_property_is_from_update (prop));
3462+
MonoClassMetadataUpdateProperty *prop_info = (MonoClassMetadataUpdateProperty *)prop;
3463+
return mono_metadata_token_index (prop_info->token);
3464+
}

src/mono/mono/component/hot_reload.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ typedef struct _MonoComponentHotReload {
5151
uint32_t (*get_method_params) (MonoImage *base_image, uint32_t methoddef_token, uint32_t *out_param_count_opt);
5252
gpointer (*added_field_ldflda) (MonoObject *instance, MonoType *field_type, uint32_t fielddef_token, MonoError *error);
5353
MonoProperty* (*added_properties_iter) (MonoClass *klass, gpointer *iter);
54+
uint32_t (*get_property_idx) (MonoProperty *prop);
5455
} MonoComponentHotReload;
5556

5657
MONO_COMPONENT_EXPORT_ENTRYPOINT

src/mono/mono/metadata/class.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2637,7 +2637,7 @@ mono_class_get_property_default_value (MonoProperty *property, MonoTypeEnum *def
26372637
}
26382638
return NULL;
26392639
}
2640-
/* TODO: metadata-update: if property is from update, get the token directly. */
2640+
/* metadata-update: Roslyn doesn't emit HasDefault on added properties. */
26412641
g_assert (!m_property_is_from_update (property));
26422642
cindex = mono_metadata_get_constant_index (klass_image, mono_class_get_property_token (property), 0);
26432643
if (!cindex)
@@ -2699,6 +2699,14 @@ guint32
26992699
mono_class_get_property_token (MonoProperty *prop)
27002700
{
27012701
MonoClass *klass = prop->parent;
2702+
2703+
if (G_UNLIKELY (m_class_get_image (klass)->has_updates)) {
2704+
if (G_UNLIKELY (m_property_is_from_update (prop))) {
2705+
uint32_t idx = mono_metadata_update_get_property_idx (prop);
2706+
return mono_metadata_make_token (MONO_TABLE_PROPERTY, idx);
2707+
}
2708+
}
2709+
27022710
while (klass) {
27032711
MonoProperty* p;
27042712
int i = 0;

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,8 @@ find_field_index (MonoClass *klass, MonoClassField *field) {
169169
static guint32
170170
find_property_index (MonoClass *klass, MonoProperty *property)
171171
{
172+
if (G_UNLIKELY (m_property_is_from_update (property)))
173+
return mono_metadata_update_get_property_idx (property);
172174
MonoClassPropertyInfo *info = mono_class_get_property_info (klass);
173175

174176
for (guint32 i = 0; i < info->count; ++i) {

src/mono/mono/metadata/icall.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6519,6 +6519,9 @@ ves_icall_property_info_get_default_value (MonoReflectionPropertyHandle property
65196519
return NULL_HANDLE;
65206520
}
65216521

6522+
/* metadata-update: looks like Roslyn doesn't set the HasDefault attribute for updates */
6523+
g_assert (!m_property_is_from_update (prop));
6524+
65226525
def_value = mono_class_get_property_default_value (prop, &def_type);
65236526

65246527
mono_type_from_blob_type (&blob_type, def_type, type);

src/mono/mono/metadata/metadata-update.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,3 +249,9 @@ mono_metadata_update_added_properties_iter (MonoClass *klass, gpointer *iter)
249249
{
250250
return mono_component_hot_reload()->added_properties_iter (klass, iter);
251251
}
252+
253+
uint32_t
254+
mono_metadata_update_get_property_idx (MonoProperty *prop)
255+
{
256+
return mono_component_hot_reload()->get_property_idx (prop);
257+
}

src/mono/mono/metadata/metadata-update.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,4 +103,7 @@ mono_metadata_update_added_field_ldflda (MonoObject *instance, MonoType *field_t
103103
MonoProperty *
104104
mono_metadata_update_added_properties_iter (MonoClass *klass, gpointer *iter);
105105

106+
uint32_t
107+
mono_metadata_update_get_property_idx (MonoProperty *prop);
108+
106109
#endif /*__MONO_METADATA_UPDATE_H__*/

src/mono/mono/metadata/reflection.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2503,7 +2503,6 @@ mono_reflection_get_token_checked (MonoObjectHandle obj, MonoError *error)
25032503
MonoReflectionPropertyHandle p = MONO_HANDLE_CAST (MonoReflectionProperty, obj);
25042504

25052505
MonoProperty *prop = MONO_HANDLE_GETVAL (p, property);
2506-
g_assert (!m_property_is_from_update (prop)); // TODO: metadata-update: get the token directly
25072506
token = mono_class_get_property_token (prop);
25082507
} else if (strcmp (klass_name, "RuntimeEventInfo") == 0) {
25092508
MonoReflectionMonoEventHandle p = MONO_HANDLE_CAST (MonoReflectionMonoEvent, obj);

0 commit comments

Comments
 (0)