2004-03-22 Ben Maurer <bmaurer@users.sourceforge.net>
authorBen Maurer <benm@mono-cvs.ximian.com>
Tue, 23 Mar 2004 01:31:08 +0000 (01:31 -0000)
committerBen Maurer <benm@mono-cvs.ximian.com>
Tue, 23 Mar 2004 01:31:08 +0000 (01:31 -0000)
* class.c: do not insert non-virtual methods in the vtable.
* icall.c, mono-debug-debugger.c, object.c: if method->slot == -1,
that means the method is non-virtual. This never would have
happened before.

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

mono/metadata/ChangeLog
mono/metadata/class.c
mono/metadata/icall.c
mono/metadata/mono-debug-debugger.c
mono/metadata/object.c

index 08516b6453d79292b763b5c69ce44f54a132e6a8..ace04aa8e235f20ae693cb4aebcbfb1f4f616ed0 100644 (file)
@@ -1,3 +1,10 @@
+2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
+
+       * class.c: do not insert non-virtual methods in the vtable.
+       * icall.c, mono-debug-debugger.c, object.c: if method->slot == -1,
+       that means the method is non-virtual. This never would have
+       happened before.
+
 2004-03-22  Lluis Sanchez Gual  <lluis@ximian.com>
 
        * profiler.c: Added lock for accessing coverage_hash.
index 58b51cce0cc0e17bb8992449f29038fbf4d13a18..3b734fd6933e39910d1b7bdee40dd798aa7041c0 100644 (file)
@@ -1058,8 +1058,19 @@ mono_class_setup_vtable (MonoClass *class, MonoMethod **overrides, int onum)
                MonoMethod *cm;
               
                cm = class->methods [i];
-
-               if (!(cm->flags & METHOD_ATTRIBUTE_NEW_SLOT) && (cm->flags & METHOD_ATTRIBUTE_VIRTUAL)) {
+               
+               /*
+                * Non-virtual method have no place in the vtable.
+                * This also catches static methods (since they are not virtual).
+                */
+               if (!(cm->flags & METHOD_ATTRIBUTE_VIRTUAL))
+                       continue;
+               
+               /*
+                * If the method is REUSE_SLOT, we must check in the
+                * base class for a method to override.
+                */
+               if (!(cm->flags & METHOD_ATTRIBUTE_NEW_SLOT)) {
                        int slot = -1;
                        for (k = class->parent; k ; k = k->parent) {
                                int j;
index f0640d114cc921cfe7aff1d8ffcb2789844afd86..92ab7e088f4bda250a3300d33a5cd703c93d871a 100644 (file)
@@ -2548,9 +2548,12 @@ handle_parent:
                }
                
                match = 0;
-               if (g_hash_table_lookup (method_slots, GUINT_TO_POINTER (method->slot)))
-                       continue;
-               g_hash_table_insert (method_slots, GUINT_TO_POINTER (method->slot), method);
+               if (method->slot != -1) {
+                       if (g_hash_table_lookup (method_slots, GUINT_TO_POINTER (method->slot)))
+                               continue;
+                       g_hash_table_insert (method_slots, GUINT_TO_POINTER (method->slot), method);
+               }
+               
                member = (MonoObject*)mono_method_get_object (domain, method, refklass);
                
                l = g_slist_prepend (l, member);
@@ -2693,9 +2696,11 @@ handle_parent:
                                continue;
                }
                
-               if (g_hash_table_lookup (method_slots, GUINT_TO_POINTER (method->slot)))
-                       continue;
-               g_hash_table_insert (method_slots, GUINT_TO_POINTER (method->slot), prop);
+               if (method->slot != -1) {
+                       if (g_hash_table_lookup (method_slots, GUINT_TO_POINTER (method->slot)))
+                               continue;
+                       g_hash_table_insert (method_slots, GUINT_TO_POINTER (method->slot), prop);
+               }
 
                l = g_slist_prepend (l, mono_property_get_object (domain, startklass, prop));
                len++;
index 5f62a4f3b1094e05edd6edbb36d9bff19e66d927..ecfd256f2ed53ca0d6f266a7c3eedfa08bdb540b 100644 (file)
@@ -653,9 +653,12 @@ write_class (MonoDebuggerSymbolTable *table, MonoClass *klass)
 
                if (method->flags & METHOD_ATTRIBUTE_SPECIAL_NAME)
                        continue;
-               if (g_hash_table_lookup (method_slots, GUINT_TO_POINTER (method->slot)))
-                       continue;
-               g_hash_table_insert (method_slots, GUINT_TO_POINTER (method->slot), method);
+               
+               if (method->slot != -1) {
+                       if (g_hash_table_lookup (method_slots, GUINT_TO_POINTER (method->slot)))
+                               continue;
+                       g_hash_table_insert (method_slots, GUINT_TO_POINTER (method->slot), method);
+               }
 
                if (method->flags & METHOD_ATTRIBUTE_STATIC) {
                        ++num_static_methods;
index b635a58b586b0ae1e3443e7dd4edc6aa377018de..952b1f4f9f735575fe48d26cbc481ce131e73dc4 100644 (file)
@@ -1422,7 +1422,7 @@ mono_runtime_invoke_array (MonoMethod *method, void *obj, MonoArray *params,
                if (!obj) {
                        obj = mono_object_new (mono_domain_get (), method->klass);
                        if (mono_object_class(obj) == mono_defaults.transparent_proxy_class) {
-                               method = mono_marshal_get_remoting_invoke (method->klass->vtable [method->slot]);
+                               method = mono_marshal_get_remoting_invoke (method->slot == -1 ? method : method->klass->vtable [method->slot]);
                        }
                }
                mono_runtime_invoke (method, obj, pa, exc);