diff options
author | Aleksey Kliger <aleksey@xamarin.com> | 2017-04-28 00:32:20 +0300 |
---|---|---|
committer | Aleksey Kliger <aleksey@xamarin.com> | 2017-04-28 18:46:47 +0300 |
commit | ad60bf18b7f42111cda55ffe0590f9134803b1c7 (patch) | |
tree | 421533866f11c1596c8bd26c89e114f6a1a02390 | |
parent | c20c0b3b817ada8fab86d842d34dc55afcb9987f (diff) |
[sre-save] Handle ConstructorBuilder custom attribute constructors.
The code expected that a custom attribute was specified as a MonoCMethod and
was calling mono_image_create_token(). However that function expects to be
called from the managed S.R.E.ModuleBuilder:GetToken (MemberInfo) which handles
all the builders in managed code. Consequently mono_image_create_token () was
asserting.
So now we encode the token for a ConstructorBuilder in place.
-rw-r--r-- | mono/metadata/sre-save.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/mono/metadata/sre-save.c b/mono/metadata/sre-save.c index 20d9e47a4a3..f430028e861 100644 --- a/mono/metadata/sre-save.c +++ b/mono/metadata/sre-save.c @@ -218,8 +218,18 @@ mono_image_add_cattrs (MonoDynamicImage *assembly, guint32 idx, guint32 type, Mo for (i = 0; i < count; ++i) { cattr = (MonoReflectionCustomAttr*)mono_array_get (cattrs, gpointer, i); values [MONO_CUSTOM_ATTR_PARENT] = idx; - token = image_create_token_raw (assembly, (MonoObject*)cattr->ctor, FALSE, FALSE, error); /* FIXME use handles */ - if (!mono_error_ok (error)) goto fail; + g_assert (cattr->ctor != NULL); + if (mono_is_sre_ctor_builder (mono_object_class (cattr->ctor))) { + MonoReflectionCtorBuilder *ctor = (MonoReflectionCtorBuilder*)cattr->ctor; + MonoMethod *method = ctor->mhandle; + if (method->klass->image == &assembly->image) + token = MONO_TOKEN_METHOD_DEF | ((MonoReflectionCtorBuilder*)cattr->ctor)->table_idx; + else + token = mono_image_get_methodref_token (assembly, method, FALSE); + } else { + token = image_create_token_raw (assembly, (MonoObject*)cattr->ctor, FALSE, FALSE, error); /* FIXME use handles */ + if (!mono_error_ok (error)) goto fail; + } type = mono_metadata_token_index (token); type <<= MONO_CUSTOM_ATTR_TYPE_BITS; switch (mono_metadata_token_table (token)) { |