Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksey Kliger <aleksey@xamarin.com>2017-04-28 00:32:20 +0300
committerAleksey Kliger <aleksey@xamarin.com>2017-04-28 18:46:47 +0300
commitad60bf18b7f42111cda55ffe0590f9134803b1c7 (patch)
tree421533866f11c1596c8bd26c89e114f6a1a02390
parentc20c0b3b817ada8fab86d842d34dc55afcb9987f (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.c14
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)) {