+2004-07-31 Bernie Solomon <bernard@ugsolutions.com>
+
+ * interp.h: add mono_interp_ftnptr_to_delegate
+
+ * transform.c (generate): use mono_interp_ftnptr_to_delegate
+ as ical function.
+
+ * interp.c: add mono_interp_ftnptr_to_delegate to create
+ interpreter style delegate. fixes pinvoke3
+
2004-07-28 Lluis Sanchez Gual <lluis@novell.com>
* interp.c: Use mono_init_from_assembly instead of mono_init.
}
}
+MonoDelegate*
+mono_interp_ftnptr_to_delegate (MonoClass *klass, gpointer ftn)
+{
+ MonoDelegate *d;
+ MonoJitInfo *ji;
+ MonoDomain *domain = mono_domain_get ();
+
+ d = (MonoDelegate*)mono_object_new (domain, klass);
+
+ ji = mono_jit_info_table_find (domain, ftn);
+ if (ji == NULL)
+ mono_raise_exception (mono_get_exception_argument ("", "Function pointer was not created by a Delegate."));
+
+ /* FIXME: discard the wrapper and call the original method */
+ interp_delegate_ctor (domain, (MonoObject*)d, NULL, mono_interp_get_runtime_method (ji->method));
+
+ return d;
+}
+
/*
* From the spec:
* runtime specifies that the implementation of the method is automatically
context->env_frame = old_env_frame;
context->current_env = old_env;
context->managed_code = 1;
- return;
+ return sp;
}
context->env_frame = context->current_frame;
MonoException *
mono_interp_transform_method (RuntimeMethod *runtime_method, ThreadContext *context);
+MonoDelegate*
+mono_interp_ftnptr_to_delegate (MonoClass *klass, gpointer ftn);
+
void
mono_interp_transform_init (void);
default:
g_assert_not_reached ();
}
+ if (func == mono_ftnptr_to_delegate)
+ func = mono_interp_ftnptr_to_delegate;
ADD_CODE(&td, get_data_item_index (&td, func));
td.sp -= info->sig->param_count;