2005-09-24 Zoltan Varga <vargaz@freemail.hu>
authorZoltan Varga <vargaz@gmail.com>
Sat, 24 Sep 2005 00:08:42 +0000 (00:08 -0000)
committerZoltan Varga <vargaz@gmail.com>
Sat, 24 Sep 2005 00:08:42 +0000 (00:08 -0000)
* object.c (mono_class_create_runtime_vtable): Avoid calling
field_is_special_static if the klass has no special static fields.

* class-internals.h (MonoClass): Add 'no_special_static_fields' flag.
(MonoCachedClassInfo): Likewise.

* object.c (mono_class_has_special_static_fields): New helper function.

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

mono/metadata/ChangeLog
mono/metadata/class-internals.h
mono/metadata/object.c

index 8814e016f9480c8cfab1d2b28b63fefc2985ddf2..6853f722a0deec7dc1bfd386fab99dd617c68188 100644 (file)
@@ -1,3 +1,13 @@
+2005-09-24  Zoltan Varga  <vargaz@freemail.hu>
+
+       * object.c (mono_class_create_runtime_vtable): Avoid calling 
+       field_is_special_static if the klass has no special static fields.
+
+       * class-internals.h (MonoClass): Add 'no_special_static_fields' flag.
+       (MonoCachedClassInfo): Likewise.
+
+       * object.c (mono_class_has_special_static_fields): New helper function.
+
 2005-09-23  Zoltan Varga  <vargaz@gmail.com>
 
        * class.c (mono_class_create_from_typedef): Don't call 
index 57b455361ba2ffcb66b4bcee9955b2c13193cfac..007e11efb08f7853060cf33e0cbfc3e8591ddb8c 100644 (file)
@@ -249,6 +249,7 @@ struct _MonoClass {
        /* next byte */
        guint has_references  : 1; /* it has GC-tracked references in the instance */
        guint has_static_refs : 1; /* it has static fields that are GC-tracked */
+       guint no_special_static_fields : 1; /* has no thread/context static fields */
 
        guint8     exception_type;      /* MONO_EXCEPTION_* */
        void*      exception_data;      /* Additional information about the exception */
@@ -431,6 +432,7 @@ typedef struct MonoCachedClassInfo {
        guint blittable : 1;
        guint has_references : 1;
        guint has_static_refs : 1;
+       guint no_special_static_fields : 1;
        guint32 cctor_token;
        MonoImage *finalize_image;
        guint32 finalize_token;
@@ -533,6 +535,9 @@ mono_class_get_finalizer (MonoClass *klass);
 gboolean
 mono_class_needs_cctor_run (MonoClass *klass, MonoMethod *caller);
 
+gboolean
+mono_class_has_special_static_fields (MonoClass *klass);
+
 void
 mono_install_trampoline (MonoTrampoline func);
 
index f700ada879b57f2ea8883405bb6ae5d666300f0d..4bb1ff197946cc40dcba90cc3ebfb87c2da9527d 100644 (file)
@@ -747,7 +747,7 @@ mono_class_create_runtime_vtable (MonoDomain *domain, MonoClass *class)
                if (mono_field_is_deleted (field))
                        continue;
                if (!(field->type->attrs & FIELD_ATTRIBUTE_LITERAL)) {
-                       gint32 special_static = field_is_special_static (class, field);
+                       gint32 special_static = class->no_special_static_fields ? SPECIAL_STATIC_NONE : field_is_special_static (class, field);
                        if (special_static != SPECIAL_STATIC_NONE) {
                                guint32 size, offset;
                                int align;
@@ -1007,6 +1007,41 @@ mono_class_proxy_vtable (MonoDomain *domain, MonoRemoteClass *remote_class, Mono
        return pvt;
 }
 
+/**
+ * mono_class_has_special_static_fields:
+ * 
+ *   Returns whenever @klass has any thread/context static fields.
+ */
+gboolean
+mono_class_has_special_static_fields (MonoClass *klass)
+{
+       MonoVTable *vt;
+       MonoClassRuntimeInfo *runtime_info, *old_info;
+       MonoClassField *field;
+       char *t;
+       int i;
+       gboolean inited = FALSE;
+       guint32 vtable_size;
+       guint32 cindex;
+       guint32 constant_cols [MONO_CONSTANT_SIZE];
+       gpointer iter;
+
+       cindex = -1;
+       iter = NULL;
+       while ((field = mono_class_get_fields (klass, &iter))) {
+               if (!(field->type->attrs & FIELD_ATTRIBUTE_STATIC))
+                       continue;
+               if (mono_field_is_deleted (field))
+                       continue;
+               if (!(field->type->attrs & FIELD_ATTRIBUTE_LITERAL)) {
+                       if (field_is_special_static (klass, field) != SPECIAL_STATIC_NONE)
+                               return TRUE;
+               }
+       }
+
+       return FALSE;
+}
+
 /**
  * create_remote_class_key:
  * Creates an array of pointers that can be used as a hash key for a remote class.