diff options
author | Miguel de Icaza <miguel@gnome.org> | 2004-09-06 20:58:02 +0400 |
---|---|---|
committer | Miguel de Icaza <miguel@gnome.org> | 2004-09-06 20:58:02 +0400 |
commit | 643ff4c10f58136ae8e918f56bb71d0ed65f2ff6 (patch) | |
tree | 3b0e6a67a34813cd87a188444b42843ad8f9cac6 | |
parent | bdc3b8fbcd36e05578acda91165c3cdff1e8381b (diff) |
2004-09-01 Miguel de Icaza <miguel@ximian.com>
* marshal.c (mono_marshal_get_managed_wrapper): Remove FIXME and
throw an exception with a cute explanation.
svn path=/branches/mono-1-0/mono/; revision=33426
-rw-r--r-- | mono/metadata/ChangeLog | 5 | ||||
-rw-r--r-- | mono/metadata/marshal.c | 23 |
2 files changed, 24 insertions, 4 deletions
diff --git a/mono/metadata/ChangeLog b/mono/metadata/ChangeLog index 68867811c16..071378d07a5 100644 --- a/mono/metadata/ChangeLog +++ b/mono/metadata/ChangeLog @@ -1,3 +1,8 @@ +2004-09-01 Miguel de Icaza <miguel@ximian.com> + + * marshal.c (mono_marshal_get_managed_wrapper): Remove FIXME and + throw an exception with a cute explanation. + 2004-09-06 Dick Porter <dick@ximian.com> * process.c (ves_icall_System_Diagnostics_Process_Start_internal): diff --git a/mono/metadata/marshal.c b/mono/metadata/marshal.c index 25be2149dbb..97a71e3a56a 100644 --- a/mono/metadata/marshal.c +++ b/mono/metadata/marshal.c @@ -2198,6 +2198,19 @@ handle_enum: return res; } +static void +raise_auto_layout_exception (MonoClass *klass) +{ + char *msg = g_strdup_printf ("The type `%s.%s' layout needs to be Sequential or Explicit", + klass->name_space, klass->name, NULL); + + MonoException *e = mono_exception_from_name_msg ( + mono_get_corlib (), "System.Runtime.InteropServices", + "MarshalDirectiveException", msg); + g_free (msg); + mono_raise_exception (e); +} + /* * generates IL code to call managed methods from unmanaged code */ @@ -2359,8 +2372,9 @@ mono_marshal_get_managed_wrapper (MonoMethod *method, MonoObject *this, MonoMars break; } - /* FIXME: Raise a MarshalDirectiveException here */ - g_assert ((klass->flags & TYPE_ATTRIBUTE_LAYOUT_MASK) != TYPE_ATTRIBUTE_AUTO_LAYOUT); + /* The class can not have an automatic layout */ + if ((klass->flags & TYPE_ATTRIBUTE_LAYOUT_MASK) == TYPE_ATTRIBUTE_AUTO_LAYOUT) + raise_auto_layout_exception (klass); if (t->attrs & PARAM_ATTRIBUTE_OUT) { mono_mb_emit_byte (mb, CEE_LDNULL); @@ -2630,8 +2644,9 @@ mono_marshal_get_managed_wrapper (MonoMethod *method, MonoObject *this, MonoMars break; } - /* FIXME: Raise a MarshalDirectiveException here */ - g_assert ((klass->flags & TYPE_ATTRIBUTE_LAYOUT_MASK) != TYPE_ATTRIBUTE_AUTO_LAYOUT); + /* The class can not have an automatic layout */ + if ((klass->flags & TYPE_ATTRIBUTE_LAYOUT_MASK) == TYPE_ATTRIBUTE_AUTO_LAYOUT) + raise_auto_layout_exception (klass); mono_mb_emit_byte (mb, CEE_STLOC_0); /* Check for null */ |