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:
authorMiguel de Icaza <miguel@gnome.org>2004-09-06 20:58:02 +0400
committerMiguel de Icaza <miguel@gnome.org>2004-09-06 20:58:02 +0400
commit643ff4c10f58136ae8e918f56bb71d0ed65f2ff6 (patch)
tree3b0e6a67a34813cd87a188444b42843ad8f9cac6
parentbdc3b8fbcd36e05578acda91165c3cdff1e8381b (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/ChangeLog5
-rw-r--r--mono/metadata/marshal.c23
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 */