Author: martin
Date: 2005-04-29 01:59:16 -0400 (Fri, 29 Apr 2005)
New Revision: 43770
Modified:
trunk/mono/mono/metadata/ChangeLog
trunk/mono/mono/metadata/class.c
trunk/mono/mono/metadata/loader.c
Log:
2005-04-29 Martin Baulig <[EMAIL PROTECTED]>
* class.c (mono_type_get_name_recurse): Update to the new naming
schema from the latest .NET 2.x beta2.
(mono_class_setup_vtable_general): If we're a generic instance,
copy the vtable from our generic type definition and inflate all
the methods in it.
* loader.c (find_method): Update to the new naming schema from the
latest .NET 2.x beta2.
Modified: trunk/mono/mono/metadata/ChangeLog
===================================================================
--- trunk/mono/mono/metadata/ChangeLog 2005-04-29 05:55:41 UTC (rev 43769)
+++ trunk/mono/mono/metadata/ChangeLog 2005-04-29 05:59:16 UTC (rev 43770)
@@ -1,3 +1,14 @@
+2005-04-29 Martin Baulig <[EMAIL PROTECTED]>
+
+ * class.c (mono_type_get_name_recurse): Update to the new naming
+ schema from the latest .NET 2.x beta2.
+ (mono_class_setup_vtable_general): If we're a generic instance,
+ copy the vtable from our generic type definition and inflate all
+ the methods in it.
+
+ * loader.c (find_method): Update to the new naming schema from the
+ latest .NET 2.x beta2.
+
2005-04-29 Raja R Harinath <[EMAIL PROTECTED]>
* class.c (mono_class_init): Add a mono_loader_unlock to the
Modified: trunk/mono/mono/metadata/class.c
===================================================================
--- trunk/mono/mono/metadata/class.c 2005-04-29 05:55:41 UTC (rev 43769)
+++ trunk/mono/mono/metadata/class.c 2005-04-29 05:59:16 UTC (rev 43770)
@@ -113,7 +113,8 @@
static void
mono_type_get_name_recurse (MonoType *type, GString *str, gboolean is_recursed,
- gboolean include_ns, gboolean include_arity)
+ gboolean include_ns, gboolean include_arity,
+ gboolean nested_plus)
{
MonoClass *klass;
@@ -123,7 +124,7 @@
mono_type_get_name_recurse (
&type->data.array->eklass->byval_arg, str,
- FALSE, include_ns, include_arity);
+ FALSE, include_ns, include_arity, nested_plus);
g_string_append_c (str, '[');
for (i = 1; i < rank; i++)
g_string_append_c (str, ',');
@@ -132,19 +133,25 @@
}
case MONO_TYPE_SZARRAY:
mono_type_get_name_recurse (
- &type->data.klass->byval_arg, str, FALSE, include_ns,
include_arity);
+ &type->data.klass->byval_arg, str, FALSE, include_ns,
include_arity,
+ nested_plus);
g_string_append (str, "[]");
break;
case MONO_TYPE_PTR:
- mono_type_get_name_recurse (type->data.type, str, FALSE,
include_ns, include_arity);
+ mono_type_get_name_recurse (
+ type->data.type, str, FALSE, include_ns, include_arity,
nested_plus);
g_string_append_c (str, '*');
break;
default:
klass = mono_class_from_mono_type (type);
if (klass->nested_in) {
mono_type_get_name_recurse (
- &klass->nested_in->byval_arg, str, TRUE,
include_ns, include_arity);
- g_string_append_c (str, '+');
+ &klass->nested_in->byval_arg, str, TRUE,
include_ns, include_arity,
+ nested_plus);
+ if (nested_plus)
+ g_string_append_c (str, '+');
+ else
+ g_string_append_c (str, '.');
}
if (include_ns && *klass->name_space) {
g_string_append (str, klass->name_space);
@@ -163,24 +170,25 @@
MonoGenericClass *gclass = klass->generic_class;
int i;
- g_string_append_c (str, '[');
+ g_string_append_c (str, '<');
for (i = 0; i < gclass->inst->type_argc; i++) {
if (i)
g_string_append_c (str, ',');
mono_type_get_name_recurse (
- gclass->inst->type_argv [i], str,
FALSE, include_ns, include_arity);
+ gclass->inst->type_argv [i], str,
FALSE, TRUE, include_arity,
+ nested_plus);
}
- g_string_append_c (str, ']');
+ g_string_append_c (str, '>');
} else if (klass->generic_container) {
int i;
- g_string_append_c (str, '[');
+ g_string_append_c (str, '<');
for (i = 0; i < klass->generic_container->type_argc;
i++) {
if (i)
g_string_append_c (str, ',');
g_string_append (str,
klass->generic_container->type_params [i].name);
}
- g_string_append_c (str, ']');
+ g_string_append_c (str, '>');
}
break;
}
@@ -195,10 +203,11 @@
*/
static char*
_mono_type_get_name (MonoType *type, gboolean is_recursed, gboolean include_ns,
- gboolean include_arity)
+ gboolean include_arity, gboolean nested_plus)
{
GString* result = g_string_new ("");
- mono_type_get_name_recurse (type, result, is_recursed, include_ns,
include_arity);
+ mono_type_get_name_recurse (
+ type, result, is_recursed, include_ns, include_arity,
nested_plus);
if (type->byref)
g_string_append_c (result, '&');
@@ -209,15 +218,23 @@
char*
mono_type_get_name (MonoType *type)
{
- return _mono_type_get_name (type, TRUE, TRUE, TRUE);
+ return _mono_type_get_name (type, TRUE, TRUE, TRUE, TRUE);
}
char*
mono_type_get_full_name (MonoType *type)
{
- return _mono_type_get_name (type, FALSE, TRUE, TRUE);
+ return _mono_type_get_name (type, FALSE, TRUE, TRUE, TRUE);
}
+char*
+mono_class_get_name_full (MonoClass *klass, gboolean include_ns, gboolean
include_arity,
+ gboolean nested_plus)
+{
+ return _mono_type_get_name (
+ &klass->byval_arg, FALSE, include_ns, include_arity,
nested_plus);
+}
+
MonoType*
mono_type_get_underlying_type (MonoType *type)
{
@@ -1225,6 +1242,35 @@
mono_loader_unlock ();
}
+static void
+setup_generic_vtable (MonoClass *class, MonoMethod **overrides, int onum)
+{
+ MonoClass *gklass = class->generic_class->container_class;
+ MonoGenericContext *gcontext = class->generic_class->context;
+ int i;
+
+ mono_class_init (gklass);
+ class->vtable_size = gklass->vtable_size;
+
+ class->vtable = g_new0 (gpointer, class->vtable_size);
+ memcpy (class->vtable, gklass->vtable, sizeof (gpointer) *
class->vtable_size);
+
+ for (i = 0; i < class->vtable_size; i++) {
+ MonoMethod *m = class->vtable [i];
+
+ if (!m)
+ continue;
+
+ m = mono_class_inflate_generic_method (m, gcontext, class);
+ class->vtable [i] = mono_get_inflated_method (m);
+ }
+
+ class->max_interface_id = gklass->max_interface_id;
+ class->interface_offsets = g_new0 (gpointer, gklass->max_interface_id +
1);
+ memcpy (class->interface_offsets, gklass->interface_offsets,
+ sizeof (gpointer) * (gklass->max_interface_id + 1));
+}
+
/*
* LOCKING: this is supposed to be called with the loader lock held.
*/
@@ -1241,6 +1287,11 @@
if (class->vtable)
return;
+ if (class->generic_class) {
+ setup_generic_vtable (class, overrides, onum);
+ return;
+ }
+
ifaces = mono_class_get_implemented_interfaces (class);
if (ifaces) {
for (i = 0; i < ifaces->len; i++) {
@@ -1289,6 +1340,7 @@
for (k = class; k ; k = k->parent) {
int nifaces = 0;
+
ifaces = mono_class_get_implemented_interfaces (k);
if (ifaces)
nifaces = ifaces->len;
@@ -1381,7 +1433,7 @@
if (ic->generic_class) {
MonoClass *the_ic =
ic->generic_class->container_class;
- the_cname = _mono_type_get_name
(&the_ic->byval_arg, TRUE, FALSE, TRUE);
+ the_cname = _mono_type_get_name
(&ic->byval_arg, FALSE, TRUE, FALSE, TRUE);
cname = the_cname;
} else {
the_cname = NULL;
@@ -1400,7 +1452,7 @@
if (!(cm->flags &
METHOD_ATTRIBUTE_VIRTUAL))
continue;
-
+
if (((fqname && !strcmp
(cm->name, fqname)) || !strcmp (cm->name, qname)) &&
mono_metadata_signature_equal (mono_method_signature (cm),
mono_method_signature (im))) {
Modified: trunk/mono/mono/metadata/loader.c
===================================================================
--- trunk/mono/mono/metadata/loader.c 2005-04-29 05:55:41 UTC (rev 43769)
+++ trunk/mono/mono/metadata/loader.c 2005-04-29 05:59:16 UTC (rev 43770)
@@ -189,16 +189,19 @@
find_method (MonoClass *klass, MonoClass *ic, const char* name,
MonoMethodSignature *sig)
{
int i;
- char *qname, *fqname;
+ char *qname, *fqname, *class_name;
+ MonoMethod *result = NULL;
if (ic) {
- qname = g_strconcat (ic->name, ".", name, NULL);
+ class_name = mono_class_get_name_full (ic, FALSE, FALSE, FALSE);
+
+ qname = g_strconcat (class_name, ".", name, NULL);
if (ic->name_space && ic->name_space [0])
- fqname = g_strconcat (ic->name_space, ".", ic->name,
".", name, NULL);
+ fqname = g_strconcat (ic->name_space, ".", class_name,
".", name, NULL);
else
fqname = NULL;
} else
- qname = fqname = NULL;
+ class_name = qname = fqname = NULL;
while (klass) {
mono_class_setup_methods (klass);
@@ -210,11 +213,15 @@
continue;
if (sig->call_convention == MONO_CALL_VARARG) {
- if (mono_metadata_signature_vararg_match (sig,
mono_method_signature (m)))
- return m;
+ if (mono_metadata_signature_vararg_match (sig,
mono_method_signature (m))) {
+ result = m;
+ goto out;
+ }
} else {
- if (mono_metadata_signature_equal (sig,
mono_method_signature (m)))
- return m;
+ if (mono_metadata_signature_equal (sig,
mono_method_signature (m))) {
+ result = m;
+ goto out;
+ }
}
}
@@ -224,7 +231,11 @@
klass = klass->parent;
}
- return NULL;
+ out:
+ g_free (class_name);
+ g_free (fqname);
+ g_free (qname);
+ return result;
}
/*
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches