2004-07-31 Bernie Solomon <bernard@ugsolutions.com>
authorBernie Solomon <bernard@mono-cvs.ximian.com>
Sun, 1 Aug 2004 02:46:06 +0000 (02:46 -0000)
committerBernie Solomon <bernard@mono-cvs.ximian.com>
Sun, 1 Aug 2004 02:46:06 +0000 (02:46 -0000)
* 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

svn path=/trunk/mono/; revision=31705

mono/interpreter/ChangeLog
mono/interpreter/interp.c
mono/interpreter/interp.h
mono/interpreter/transform.c

index 51519fd0f85eb77a43e9b92075b92369636d724e..50dd0468f0258572049e2ef148a7938b8470b882 100644 (file)
@@ -1,3 +1,13 @@
+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.
index b6df0c2b1b63ac5e8598a4a1e0dbbf83500a25de..10b043bd012af29c45262bdec47bdb4833643294 100644 (file)
@@ -760,6 +760,25 @@ interp_delegate_ctor (MonoDomain *domain, MonoObject *this, MonoObject *target,
        }
 }
 
+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
@@ -1209,7 +1228,7 @@ do_icall (ThreadContext *context, int op, stackval *sp, gpointer ptr)
                context->env_frame = old_env_frame;
                context->current_env = old_env;
                context->managed_code = 1;
-               return;
+               return sp;
        }
 
        context->env_frame = context->current_frame;
index f403a92d7c7c65c95e6922aed2ece80b90f6351f..18cc9f245d9447326ab1d1e0b6e70b7223b840c9 100644 (file)
@@ -109,6 +109,9 @@ void mono_init_icall (void);
 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);
 
index 2d3e73ee6374707dc521283b4936360b20a8af85..f28203df6401c22b401d22ac66ff6bb400e43eea 100644 (file)
@@ -2427,6 +2427,8 @@ generate(MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start)
                                        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;