2
0
Эх сурвалжийг харах

Thu Nov 29 18:20:58 CET 2001 Paolo Molaro <[email protected]>

	* class.h, class.h: take minimum alignment into consideration so
	that the fields of a class remain aligned also when in an array.

svn path=/trunk/mono/; revision=1469
Paolo Molaro 24 жил өмнө
parent
commit
9195559f70

+ 5 - 0
mono/metadata/ChangeLog

@@ -1,4 +1,9 @@
 
+Thu Nov 29 18:20:58 CET 2001 Paolo Molaro <[email protected]>
+
+	* class.h, class.h: take minimum alignment into consideration so
+	that the fields of a class remain aligned also when in an array.
+
 Tue Nov 27 16:39:01 CET 2001 Paolo Molaro <[email protected]>
 
 	* loader.h, loader.c: add mono_method_get_param_names().

+ 7 - 2
mono/metadata/class.c

@@ -131,6 +131,7 @@ class_compute_field_layout (MonoClass *class)
 			int size, align;
 			
 			size = mono_type_size (class->fields [i].type, &align);
+			class->min_align = MAX (align, class->min_align);
 			if (class->fields [i].type->attrs & FIELD_ATTRIBUTE_STATIC) {
 				class->fields [i].offset = class->class_size;
 				class->class_size += (class->class_size % align);
@@ -141,6 +142,10 @@ class_compute_field_layout (MonoClass *class)
 				class->instance_size += size;
 			}
 		}
+		if (class->instance_size & (class->min_align - 1)) {
+			class->instance_size += class->min_align - 1;
+			class->instance_size &= ~(class->min_align - 1);
+		}
 		break;
 	case TYPE_ATTRIBUTE_EXPLICIT_LAYOUT:
 		for (i = 0; i < top; i++){
@@ -188,17 +193,17 @@ mono_class_metadata_init (MonoClass *class)
 
 	if (class->metadata_inited)
 		return;
+	class->metadata_inited = 1;
 
 	if (class->parent) {
 		if (!class->parent->metadata_inited)
 			mono_class_metadata_init (class->parent);
 		class->instance_size += class->parent->instance_size;
 		class->class_size += class->parent->class_size;
+		class->min_align = class->parent->min_align;
 		cur_slot = class->parent->vtable_size;
 	}
 
-	class->metadata_inited = 1;
-
 	/*
 	 * Computes the size used by the fields, and their locations
 	 */

+ 1 - 0
mono/metadata/class.h

@@ -26,6 +26,7 @@ struct _MonoClass {
 	guint metadata_inited : 1;
 	guint valuetype       : 1; /* derives from System.ValueType */
 	guint enumtype        : 1; /* derives from System.Enum */
+	guint min_align       : 4;
 
 	MonoClass  *parent;
 	GList      *subclasses; /* list of all subclasses */