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:
authorBernhard Urban <bernhard.urban@xamarin.com>2017-02-27 19:55:53 +0300
committerBernhard Urban <bernhard.urban@xamarin.com>2017-03-01 00:59:28 +0300
commit3f6f50317d821d746bf033c77e177aa81323b102 (patch)
tree049b1beeb6bf1ee59c379a3ba0085e8e61bcc5b5
parent959d68eacc859a54fcc633bb7b81c6a37a3faf62 (diff)
[interpreter] inflate signature for calli with proper generic_context
-rw-r--r--mono/mini/interpreter/transform.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/mono/mini/interpreter/transform.c b/mono/mini/interpreter/transform.c
index 8370c006eab..5e4c1aaac4b 100644
--- a/mono/mini/interpreter/transform.c
+++ b/mono/mini/interpreter/transform.c
@@ -661,6 +661,12 @@ interp_transform_call (TransformData *td, MonoMethod *method, MonoMethod *target
csignature = (MonoMethodSignature *)mono_method_get_wrapper_data (method, token);
else
csignature = mono_metadata_parse_signature (image, token);
+
+ if (generic_context) {
+ csignature = mono_inflate_generic_signature (csignature, generic_context, &error);
+ mono_error_cleanup (&error); /* FIXME: don't swallow the error */
+ }
+
target_method = NULL;
} else {
if (method->wrapper_type == MONO_WRAPPER_NONE)
@@ -839,13 +845,12 @@ interp_transform_call (TransformData *td, MonoMethod *method, MonoMethod *target
}
static void
-generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start)
+generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, MonoGenericContext *generic_context)
{
MonoMethodHeader *header = mono_method_get_header (method);
MonoMethodSignature *signature = mono_method_signature (method);
MonoImage *image = method->klass->image;
MonoDomain *domain = mono_domain_get ();
- MonoGenericContext *generic_context = NULL;
MonoClass *constrained_class = NULL;
MonoError error;
int offset, mt;
@@ -861,9 +866,6 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start)
TransformData td;
int generating_code = 1;
- if (mono_method_signature (method)->is_inflated)
- generic_context = &((MonoMethodInflated *) method)->context;
-
memset(&td, 0, sizeof(td));
td.method = method;
td.rtm = rtm;
@@ -3082,7 +3084,12 @@ mono_interp_transform_method (RuntimeMethod *runtime_method, ThreadContext *cont
mono_profiler_method_jit (method); /* sort of... */
if (mono_method_signature (method)->is_inflated)
- generic_context = &((MonoMethodInflated *) method)->context;
+ generic_context = mono_method_get_context (method);
+ else {
+ MonoGenericContainer *generic_container = mono_method_get_generic_container (method);
+ if (generic_container)
+ generic_context = &generic_container->context;
+ }
if (method->iflags & (METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL | METHOD_IMPL_ATTRIBUTE_RUNTIME)) {
MonoMethod *nm = NULL;
@@ -3296,7 +3303,7 @@ mono_interp_transform_method (RuntimeMethod *runtime_method, ThreadContext *cont
runtime_method->args_size = offset;
g_assert (runtime_method->args_size < 10000);
- generate(method, runtime_method, is_bb_start);
+ generate (method, runtime_method, is_bb_start, generic_context);
g_free (is_bb_start);