From 543cb488437ea0b05a58e3297214a0c9fb2064ea Mon Sep 17 00:00:00 2001 From: monojenkins Date: Thu, 10 Dec 2020 16:06:15 -0500 Subject: [PATCH] [reflection] Don't get parameter default values for wrapper methods (#45018) The lookup assumes that the method came from metadata, which is not the case for wrappers. Fixes mono/mono#20600 Co-authored-by: lambdageek --- src/mono/mono/metadata/reflection.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/mono/mono/metadata/reflection.c b/src/mono/mono/metadata/reflection.c index d6097f3..56ea830 100644 --- a/src/mono/mono/metadata/reflection.c +++ b/src/mono/mono/metadata/reflection.c @@ -963,7 +963,8 @@ add_parameter_object_to_array (MonoDomain *domain, MonoMethod *method, MonoObjec MonoObjectHandle def_value; - if (!(sig_param->attrs & PARAM_ATTRIBUTE_HAS_DEFAULT)) { + if (!(sig_param->attrs & PARAM_ATTRIBUTE_HAS_DEFAULT) || + (method->wrapper_type != MONO_WRAPPER_NONE && method->wrapper_type != MONO_WRAPPER_DYNAMIC_METHOD)) { if (sig_param->attrs & PARAM_ATTRIBUTE_OPTIONAL) def_value = get_reflection_missing (domain, missing); else @@ -1056,10 +1057,12 @@ param_objects_construct (MonoDomain *domain, MonoClass *refclass, MonoMethodSign gboolean any_default_value; any_default_value = FALSE; - for (i = 0; i < sig->param_count; ++i) { - if ((sig->params [i]->attrs & PARAM_ATTRIBUTE_HAS_DEFAULT) != 0) { - any_default_value = TRUE; - break; + if (method->wrapper_type == MONO_WRAPPER_NONE || method->wrapper_type == MONO_WRAPPER_DYNAMIC_METHOD ) { + for (i = 0; i < sig->param_count; ++i) { + if ((sig->params [i]->attrs & PARAM_ATTRIBUTE_HAS_DEFAULT) != 0) { + any_default_value = TRUE; + break; + } } } if (any_default_value) { -- 2.7.4