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:
Diffstat (limited to 'mono/mini/mini-exceptions.c')
-rw-r--r--mono/mini/mini-exceptions.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/mono/mini/mini-exceptions.c b/mono/mini/mini-exceptions.c
index 144a61ad654..a5280f3a29d 100644
--- a/mono/mini/mini-exceptions.c
+++ b/mono/mini/mini-exceptions.c
@@ -832,7 +832,7 @@ mono_get_generic_info_from_stack_frame (MonoJitInfo *ji, MonoContext *ctx)
}
method = jinfo_get_method (ji);
- if (mono_method_get_context (method)->method_inst) {
+ if (mono_method_get_context (method)->method_inst || mini_method_is_default_method (method)) {
/* A MonoMethodRuntimeGenericContext* */
return info;
} else if ((method->flags & METHOD_ATTRIBUTE_STATIC) || m_class_is_valuetype (method->klass)) {
@@ -860,12 +860,13 @@ mono_get_generic_context_from_stack_frame (MonoJitInfo *ji, gpointer generic_inf
method = jinfo_get_method (ji);
g_assert (method->is_inflated);
- if (mono_method_get_context (method)->method_inst) {
+ if (mono_method_get_context (method)->method_inst || mini_method_is_default_method (method)) {
MonoMethodRuntimeGenericContext *mrgctx = (MonoMethodRuntimeGenericContext *)generic_info;
klass = mrgctx->class_vtable->klass;
context.method_inst = mrgctx->method_inst;
- g_assert (context.method_inst);
+ if (!mini_method_is_default_method (method))
+ g_assert (context.method_inst);
} else {
MonoVTable *vtable = (MonoVTable *)generic_info;
@@ -878,6 +879,12 @@ mono_get_generic_context_from_stack_frame (MonoJitInfo *ji, gpointer generic_inf
else
method_container_class = method->klass;
+ if (mini_method_is_default_method (method)) {
+ if (mono_class_is_ginst (klass) || mono_class_is_gtd (klass))
+ context.class_inst = mini_class_get_context (klass)->class_inst;
+ return context;
+ }
+
/* class might refer to a subclass of method's class */
while (!(klass == method->klass || (mono_class_is_ginst (klass) && mono_class_get_generic_class (klass)->container_class == method_container_class))) {
klass = m_class_get_parent (klass);