+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
/* 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 */
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;
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);
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;
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.