Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Molaro <lupus@oddwiz.org>2003-07-18 15:27:24 +0400
committerPaolo Molaro <lupus@oddwiz.org>2003-07-18 15:27:24 +0400
commit0e226477f8fdf11b64bd46d7a414ccf51afee4b8 (patch)
tree695a43df63cd4fb54faab56e3f6d0b09169754ea
parentb8f111e8e8320f6f968d10b498f493504ae1fec3 (diff)
Fri Jul 18 13:12:21 CEST 2003 Paolo Molaro <lupus@ximian.com>
* class.c, class.h, debug-helpers.c, icall.c, image.c, marshal.c, metadata.c, metadata.h, mono-debug-debugger.c, object.c, reflection.c: array type representation changes. svn path=/trunk/mono/; revision=16394
-rw-r--r--mono/metadata/ChangeLog6
-rw-r--r--mono/metadata/class.c22
-rw-r--r--mono/metadata/class.h2
-rw-r--r--mono/metadata/debug-helpers.c32
-rw-r--r--mono/metadata/icall.c6
-rw-r--r--mono/metadata/image.c3
-rw-r--r--mono/metadata/marshal.c4
-rw-r--r--mono/metadata/metadata.c34
-rw-r--r--mono/metadata/metadata.h4
-rw-r--r--mono/metadata/mono-debug-debugger.c4
-rw-r--r--mono/metadata/object.c2
-rw-r--r--mono/metadata/reflection.c39
12 files changed, 76 insertions, 82 deletions
diff --git a/mono/metadata/ChangeLog b/mono/metadata/ChangeLog
index bfa9f184ba7..56c10437899 100644
--- a/mono/metadata/ChangeLog
+++ b/mono/metadata/ChangeLog
@@ -1,4 +1,10 @@
+Fri Jul 18 13:12:21 CEST 2003 Paolo Molaro <lupus@ximian.com>
+
+ * class.c, class.h, debug-helpers.c, icall.c, image.c, marshal.c,
+ metadata.c, metadata.h, mono-debug-debugger.c, object.c, reflection.c:
+ array type representation changes.
+
Fri Jul 18 11:26:58 CEST 2003 Paolo Molaro <lupus@ximian.com>
* icall.c, appdomain.h, appdomain.c: support full runtime shutdown
diff --git a/mono/metadata/class.c b/mono/metadata/class.c
index 009420a91f5..db7b01e7a20 100644
--- a/mono/metadata/class.c
+++ b/mono/metadata/class.c
@@ -1452,13 +1452,13 @@ mono_class_from_mono_type (MonoType *type)
case MONO_TYPE_TYPEDBYREF:
return mono_defaults.typed_reference_class;
case MONO_TYPE_ARRAY:
- return mono_array_class_get (type->data.array->type, type->data.array->rank);
+ return mono_array_class_get (type->data.array->eklass, type->data.array->rank);
case MONO_TYPE_PTR:
return mono_ptr_class_get (type->data.type);
case MONO_TYPE_FNPTR:
return mono_fnptr_class_get (type->data.method);
case MONO_TYPE_SZARRAY:
- return mono_array_class_get (type->data.type, 1);
+ return mono_array_class_get (type->data.klass, 1);
case MONO_TYPE_CLASS:
case MONO_TYPE_VALUETYPE:
return type->data.klass;
@@ -1497,10 +1497,10 @@ mono_class_create_from_typespec (MonoImage *image, guint32 type_spec)
switch (type->type) {
case MONO_TYPE_ARRAY:
- class = mono_array_class_get (type->data.array->type, type->data.array->rank);
+ class = mono_array_class_get (type->data.array->eklass, type->data.array->rank);
break;
case MONO_TYPE_SZARRAY:
- class = mono_array_class_get (type->data.type, 1);
+ class = mono_array_class_get (type->data.klass, 1);
break;
case MONO_TYPE_PTR:
class = mono_class_from_mono_type (type->data.type);
@@ -1518,16 +1518,15 @@ mono_class_create_from_typespec (MonoImage *image, guint32 type_spec)
/**
* mono_array_class_get:
- * @element_type: element type
+ * @element_class: element class
* @rank: the dimension of the array class
*
* Returns: a class object describing the array with element type @element_type and
* dimension @rank.
*/
MonoClass *
-mono_array_class_get (MonoType *element_type, guint32 rank)
+mono_array_class_get (MonoClass *eclass, guint32 rank)
{
- MonoClass *eclass;
MonoImage *image;
MonoClass *class;
MonoClass *parent = NULL;
@@ -1535,7 +1534,6 @@ mono_array_class_get (MonoType *element_type, guint32 rank)
int nsize;
char *name;
- eclass = mono_class_from_mono_type (element_type);
g_assert (rank <= 255);
parent = mono_defaults.array_class;
@@ -1545,7 +1543,7 @@ mono_array_class_get (MonoType *element_type, guint32 rank)
image = eclass->image;
- if ((rootlist = list = g_hash_table_lookup (image->array_cache, &eclass->byval_arg))) {
+ if ((rootlist = list = g_hash_table_lookup (image->array_cache, eclass))) {
for (; list; list = list->next) {
class = list->data;
if (class->rank == rank)
@@ -1590,19 +1588,19 @@ mono_array_class_get (MonoType *element_type, guint32 rank)
MonoArrayType *at = g_new0 (MonoArrayType, 1);
class->byval_arg.type = MONO_TYPE_ARRAY;
class->byval_arg.data.array = at;
- at->type = &eclass->byval_arg;
+ at->eklass = eclass;
at->rank = rank;
/* FIXME: complete.... */
} else {
/* FIXME: this is not correct. the lbound could be >0 */
class->byval_arg.type = MONO_TYPE_SZARRAY;
- class->byval_arg.data.type = &eclass->byval_arg;
+ class->byval_arg.data.klass = eclass;
}
class->this_arg = class->byval_arg;
class->this_arg.byref = 1;
list = g_slist_append (rootlist, class);
- g_hash_table_insert (image->array_cache, &class->element_class->byval_arg, list);
+ g_hash_table_insert (image->array_cache, eclass, list);
return class;
}
diff --git a/mono/metadata/class.h b/mono/metadata/class.h
index 76b5e266648..d687dff4533 100644
--- a/mono/metadata/class.h
+++ b/mono/metadata/class.h
@@ -241,7 +241,7 @@ MonoMethod**
mono_class_get_overrides (MonoImage *image, guint32 type_token, gint32 *num_overrides);
MonoClass *
-mono_array_class_get (MonoType *element_type, guint32 rank);
+mono_array_class_get (MonoClass *element_class, guint32 rank);
MonoClass *
mono_ptr_class_get (MonoType *type);
diff --git a/mono/metadata/debug-helpers.c b/mono/metadata/debug-helpers.c
index f411d850717..c9171f0f4e2 100644
--- a/mono/metadata/debug-helpers.c
+++ b/mono/metadata/debug-helpers.c
@@ -14,6 +14,22 @@ struct MonoMethodDesc {
gboolean include_namespace;
};
+static void
+append_class_name (GString *res, MonoClass *class, gboolean include_namespace)
+{
+ if (!class) {
+ g_string_append (res, "Unknown");
+ return;
+ }
+ if (class->nested_in) {
+ append_class_name (res, class->nested_in, include_namespace);
+ g_string_append_c (res, '/');
+ }
+ if (include_namespace && *(class->name_space))
+ g_string_sprintfa (res, "%s.", class->name_space);
+ g_string_sprintfa (res, "%s", class->name);
+}
+
void
mono_type_get_desc (GString *res, MonoType *type, gboolean include_namespace) {
switch (type->type) {
@@ -58,25 +74,17 @@ mono_type_get_desc (GString *res, MonoType *type, gboolean include_namespace) {
g_string_append_c (res, '*');
break;
case MONO_TYPE_ARRAY:
- mono_type_get_desc (res, type->data.array->type, include_namespace);
+ append_class_name (res, type->data.array->eklass, include_namespace);
g_string_sprintfa (res, "[%d]", type->data.array->rank);
break;
case MONO_TYPE_SZARRAY:
- mono_type_get_desc (res, type->data.type, include_namespace);
+ mono_type_get_desc (res, &type->data.klass->byval_arg, include_namespace);
g_string_append (res, "[]");
break;
case MONO_TYPE_CLASS:
- case MONO_TYPE_VALUETYPE: {
- MonoClass *class = type->data.klass;
- if (!class) {
- g_string_append (res, "Unknown");
- break;
- }
- if (include_namespace && *(class->name_space))
- g_string_sprintfa (res, "%s.", class->name_space);
- g_string_sprintfa (res, "%s", class->name);
+ case MONO_TYPE_VALUETYPE:
+ append_class_name (res, type->data.klass, include_namespace);
break;
- }
default:
break;
}
diff --git a/mono/metadata/icall.c b/mono/metadata/icall.c
index ddf0674daed..8bbcdc69f05 100644
--- a/mono/metadata/icall.c
+++ b/mono/metadata/icall.c
@@ -464,7 +464,7 @@ ves_icall_System_Array_CreateInstanceImpl (MonoReflectionType *type, MonoArray *
if (mono_array_get (lengths, gint32, i) < 0)
mono_raise_exception (mono_get_exception_argument_out_of_range (NULL));
- aklass = mono_array_class_get (type->type, mono_array_length (lengths));
+ aklass = mono_array_class_get (mono_class_from_mono_type (type->type), mono_array_length (lengths));
sizes = alloca (aklass->rank * sizeof(guint32) * 2);
for (i = 0; i < aklass->rank; ++i) {
@@ -2785,7 +2785,7 @@ ves_icall_ModuleBuilder_create_modified_type (MonoReflectionTypeBuilder *tb, Mon
return NULL;
}
p++;
- klass = mono_array_class_get (&klass->byval_arg, rank);
+ klass = mono_array_class_get (klass, rank);
mono_class_init (klass);
break;
default:
@@ -4177,7 +4177,7 @@ static gconstpointer icall_map [] = {
"System.Diagnostics.Process::GetPid_internal()", ves_icall_System_Diagnostics_Process_GetPid_internal,
"System.Diagnostics.Process::Process_free_internal(intptr)", ves_icall_System_Diagnostics_Process_Process_free_internal,
"System.Diagnostics.Process::GetModules_internal()", ves_icall_System_Diagnostics_Process_GetModules_internal,
- "System.Diagnostics.Process::Start_internal(string,string,intptr,intptr,intptr,ProcInfo&)", ves_icall_System_Diagnostics_Process_Start_internal,
+ "System.Diagnostics.Process::Start_internal(string,string,intptr,intptr,intptr,System.Diagnostics.Process/ProcInfo&)", ves_icall_System_Diagnostics_Process_Start_internal,
"System.Diagnostics.Process::WaitForExit_internal(intptr,int)", ves_icall_System_Diagnostics_Process_WaitForExit_internal,
"System.Diagnostics.Process::ExitTime_internal(intptr)", ves_icall_System_Diagnostics_Process_ExitTime_internal,
"System.Diagnostics.Process::StartTime_internal(intptr)", ves_icall_System_Diagnostics_Process_StartTime_internal,
diff --git a/mono/metadata/image.c b/mono/metadata/image.c
index aec22116a0a..6f118799e53 100644
--- a/mono/metadata/image.c
+++ b/mono/metadata/image.c
@@ -469,8 +469,7 @@ mono_image_init (MonoImage *image)
image->method_cache = g_hash_table_new (g_direct_hash, g_direct_equal);
image->class_cache = g_hash_table_new (g_direct_hash, g_direct_equal);
image->name_cache = g_hash_table_new (g_str_hash, g_str_equal);
- image->array_cache = g_hash_table_new ((GHashFunc)mono_metadata_type_hash,
- (GCompareFunc)mono_metadata_type_equal);
+ image->array_cache = g_hash_table_new (NULL, NULL);
image->delegate_begin_invoke_cache =
g_hash_table_new ((GHashFunc)mono_signature_hash,
diff --git a/mono/metadata/marshal.c b/mono/metadata/marshal.c
index 7b7e9aa53e8..20115dc19f7 100644
--- a/mono/metadata/marshal.c
+++ b/mono/metadata/marshal.c
@@ -577,7 +577,7 @@ emit_ptr_to_str_conv (MonoMethodBuilder *mb, MonoType *type, MonoMarshalConv con
int esize;
if (type->type == MONO_TYPE_SZARRAY) {
- eclass = mono_class_from_mono_type (type->data.type);
+ eclass = type->data.klass;
} else {
g_assert_not_reached ();
}
@@ -747,7 +747,7 @@ emit_str_to_ptr_conv (MonoMethodBuilder *mb, MonoType *type, MonoMarshalConv con
int esize;
if (type->type == MONO_TYPE_SZARRAY) {
- eclass = mono_class_from_mono_type (type->data.type);
+ eclass = type->data.klass;
} else {
g_assert_not_reached ();
}
diff --git a/mono/metadata/metadata.c b/mono/metadata/metadata.c
index a3435b293a8..fca4ad82e56 100644
--- a/mono/metadata/metadata.c
+++ b/mono/metadata/metadata.c
@@ -1056,8 +1056,10 @@ mono_metadata_parse_array (MonoImage *m, const char *ptr, const char **rptr)
{
int i;
MonoArrayType *array = g_new0 (MonoArrayType, 1);
+ MonoType *etype;
- array->type = mono_metadata_parse_type (m, MONO_PARSE_TYPE, 0, ptr, &ptr);
+ etype = mono_metadata_parse_type (m, MONO_PARSE_TYPE, 0, ptr, &ptr);
+ array->eklass = mono_class_from_mono_type (etype);
array->rank = mono_metadata_decode_value (ptr, &ptr);
array->numsizes = mono_metadata_decode_value (ptr, &ptr);
@@ -1086,7 +1088,6 @@ mono_metadata_parse_array (MonoImage *m, const char *ptr, const char **rptr)
void
mono_metadata_free_array (MonoArrayType *array)
{
- mono_metadata_free_type (array->type);
g_free (array->sizes);
g_free (array->lobounds);
g_free (array);
@@ -1464,7 +1465,11 @@ do_mono_metadata_parse_type (MonoType *type, MonoImage *m, const char *ptr, cons
type->data.klass = mono_class_get (m, token);
break;
}
- case MONO_TYPE_SZARRAY:
+ case MONO_TYPE_SZARRAY: {
+ MonoType *etype = mono_metadata_parse_type (m, MONO_PARSE_MOD_TYPE, 0, ptr, &ptr);
+ type->data.klass = mono_class_from_mono_type (etype);
+ break;
+ }
case MONO_TYPE_PTR:
type->data.type = mono_metadata_parse_type (m, MONO_PARSE_MOD_TYPE, 0, ptr, &ptr);
break;
@@ -1504,7 +1509,6 @@ mono_metadata_free_type (MonoType *type)
if (type >= builtin_types && type < builtin_types + NBUILTIN_TYPES ())
return;
switch (type->type){
- case MONO_TYPE_SZARRAY:
case MONO_TYPE_PTR:
mono_metadata_free_type (type->data.type);
break;
@@ -2297,16 +2301,13 @@ mono_metadata_type_hash (MonoType *t1)
switch (t1->type) {
case MONO_TYPE_VALUETYPE:
case MONO_TYPE_CLASS:
+ case MONO_TYPE_SZARRAY:
/* check if the distribution is good enough */
return ((hash << 5) - hash) ^ g_str_hash (t1->data.klass->name);
case MONO_TYPE_PTR:
return ((hash << 5) - hash) ^ mono_metadata_type_hash (t1->data.type);
- case MONO_TYPE_SZARRAY:
- if (t1->data.type->type == MONO_TYPE_OBJECT)
- return ((hash << 5) - hash);
- return ((hash << 5) - hash) ^ (gint32)(t1->data.type->data.klass);
case MONO_TYPE_ARRAY:
- return ((hash << 5) - hash) ^ mono_metadata_type_hash (t1->data.array->type);
+ return ((hash << 5) - hash) ^ mono_metadata_type_hash (&t1->data.array->eklass->byval_arg);
}
return hash;
}
@@ -2348,25 +2349,14 @@ mono_metadata_type_equal (MonoType *t1, MonoType *t2)
return TRUE;
case MONO_TYPE_VALUETYPE:
case MONO_TYPE_CLASS:
+ case MONO_TYPE_SZARRAY:
return t1->data.klass == t2->data.klass;
case MONO_TYPE_PTR:
return mono_metadata_type_equal (t1->data.type, t2->data.type);
- case MONO_TYPE_SZARRAY:
-retry_sz:
- if (t1->data.type->type != t2->data.type->type)
- return FALSE;
- if (t1->data.type->type == MONO_TYPE_CLASS || t1->data.type->type == MONO_TYPE_VALUETYPE)
- return t1->data.type->data.klass == t2->data.type->data.klass;
- if (t1->data.type->type == MONO_TYPE_SZARRAY) {
- t1 = t1->data.type;
- t2 = t2->data.type;
- goto retry_sz;
- }
- return mono_metadata_type_equal (t1->data.type, t2->data.type);
case MONO_TYPE_ARRAY:
if (t1->data.array->rank != t2->data.array->rank)
return FALSE;
- return mono_metadata_type_equal (t1->data.array->type, t2->data.array->type);
+ return t1->data.array->eklass == t2->data.array->eklass;
default:
g_error ("implement type compare for %0x!", t1->type);
return FALSE;
diff --git a/mono/metadata/metadata.h b/mono/metadata/metadata.h
index c708354fa13..837149171f3 100644
--- a/mono/metadata/metadata.h
+++ b/mono/metadata/metadata.h
@@ -264,7 +264,7 @@ typedef struct {
} MonoCustomMod;
struct _MonoArrayType {
- MonoType *type;
+ MonoClass *eklass;
int rank;
int numsizes;
int numlobounds;
@@ -284,7 +284,7 @@ struct _MonoGenericInst {
struct _MonoType {
union {
MonoClass *klass; /* for VALUETYPE and CLASS */
- MonoType *type; /* for PTR and SZARRAY */
+ MonoType *type; /* for PTR */
MonoArrayType *array; /* for ARRAY */
MonoMethodSignature *method;
int type_param;
diff --git a/mono/metadata/mono-debug-debugger.c b/mono/metadata/mono-debug-debugger.c
index 5e9cb1a7311..918370cd785 100644
--- a/mono/metadata/mono-debug-debugger.c
+++ b/mono/metadata/mono-debug-debugger.c
@@ -594,7 +594,7 @@ write_type (MonoDebuggerSymbolTable *table, MonoType *type)
*ptr++ = (guint8*)&array.max_length - (guint8*)&array;
*ptr++ = sizeof (array.max_length);
*ptr++ = (guint8*)&array.vector - (guint8*)&array;
- *((guint32 *) ptr) = write_type (table, type->data.type);
+ *((guint32 *) ptr) = write_type (table, &type->data.klass->byval_arg);
ptr += sizeof(guint32);
break;
}
@@ -618,7 +618,7 @@ write_type (MonoDebuggerSymbolTable *table, MonoType *type)
*ptr++ = sizeof (bounds.lower_bound);
*ptr++ = (guint8*)&bounds.length - (guint8*)&bounds;
*ptr++ = sizeof (bounds.length);
- *((guint32 *) ptr) = write_type (table, type->data.array->type);
+ *((guint32 *) ptr) = write_type (table, &type->data.array->eklass->byval_arg);
ptr += sizeof(guint32);
break;
}
diff --git a/mono/metadata/object.c b/mono/metadata/object.c
index f0ae28c6e12..a18d980d5ae 100644
--- a/mono/metadata/object.c
+++ b/mono/metadata/object.c
@@ -1487,7 +1487,7 @@ mono_array_new (MonoDomain *domain, MonoClass *eclass, guint32 n)
MONO_ARCH_SAVE_REGS;
- ac = mono_array_class_get (&eclass->byval_arg, 1);
+ ac = mono_array_class_get (eclass, 1);
g_assert (ac != NULL);
return mono_array_new_specific (mono_class_vtable (domain, ac), n);
diff --git a/mono/metadata/reflection.c b/mono/metadata/reflection.c
index 784f51a1d04..8e50c3fe253 100644
--- a/mono/metadata/reflection.c
+++ b/mono/metadata/reflection.c
@@ -335,10 +335,13 @@ encode_type (MonoDynamicAssembly *assembly, MonoType *type, char *p, char **endb
mono_metadata_encode_value (type->type, p, &p);
break;
case MONO_TYPE_PTR:
- case MONO_TYPE_SZARRAY:
mono_metadata_encode_value (type->type, p, &p);
encode_type (assembly, type->data.type, p, &p);
break;
+ case MONO_TYPE_SZARRAY:
+ mono_metadata_encode_value (type->type, p, &p);
+ encode_type (assembly, &type->data.klass->byval_arg, p, &p);
+ break;
case MONO_TYPE_VALUETYPE:
case MONO_TYPE_CLASS:
mono_metadata_encode_value (type->type, p, &p);
@@ -356,7 +359,7 @@ encode_type (MonoDynamicAssembly *assembly, MonoType *type, char *p, char **endb
#endif
case MONO_TYPE_ARRAY:
mono_metadata_encode_value (type->type, p, &p);
- encode_type (assembly, type->data.array->type, p, &p);
+ encode_type (assembly, &type->data.array->eklass->byval_arg, p, &p);
mono_metadata_encode_value (type->data.array->rank, p, &p);
mono_metadata_encode_value (0, p, &p); /* FIXME: set to 0 for now */
mono_metadata_encode_value (0, p, &p);
@@ -3504,25 +3507,14 @@ mymono_metadata_type_equal (MonoType *t1, MonoType *t2)
return TRUE;
case MONO_TYPE_VALUETYPE:
case MONO_TYPE_CLASS:
+ case MONO_TYPE_SZARRAY:
return t1->data.klass == t2->data.klass;
case MONO_TYPE_PTR:
return mymono_metadata_type_equal (t1->data.type, t2->data.type);
- case MONO_TYPE_SZARRAY:
-retry_sz:
- if (t1->data.type->type != t2->data.type->type)
- return FALSE;
- if (t1->data.type->type == MONO_TYPE_CLASS || t1->data.type->type == MONO_TYPE_VALUETYPE)
- return t1->data.type->data.klass == t2->data.type->data.klass;
- if (t1->data.type->type == MONO_TYPE_SZARRAY) {
- t1 = t1->data.type;
- t2 = t2->data.type;
- goto retry_sz;
- }
- return mymono_metadata_type_equal (t1->data.type, t2->data.type);
case MONO_TYPE_ARRAY:
if (t1->data.array->rank != t2->data.array->rank)
return FALSE;
- return mymono_metadata_type_equal (t1->data.array->type, t2->data.array->type);
+ return t1->data.array->eklass == t2->data.array->eklass;
default:
g_error ("implement type compare for %0x!", t1->type);
return FALSE;
@@ -3542,10 +3534,10 @@ mymono_metadata_type_hash (MonoType *t1)
switch (t1->type) {
case MONO_TYPE_VALUETYPE:
case MONO_TYPE_CLASS:
+ case MONO_TYPE_SZARRAY:
/* check if the distribution is good enough */
return ((hash << 5) - hash) ^ g_str_hash (t1->data.klass->name);
case MONO_TYPE_PTR:
- case MONO_TYPE_SZARRAY:
return ((hash << 5) - hash) ^ mymono_metadata_type_hash (t1->data.type);
}
return hash;
@@ -3977,7 +3969,7 @@ mono_type_get_name_recurse (MonoType *type, GString *str)
case MONO_TYPE_ARRAY: {
int i, rank = type->data.array->rank;
- mono_type_get_name_recurse (type->data.array->type, str);
+ mono_type_get_name_recurse (&type->data.array->eklass->byval_arg, str);
g_string_append_c (str, '[');
for (i = 1; i < rank; i++)
g_string_append_c (str, ',');
@@ -3985,7 +3977,7 @@ mono_type_get_name_recurse (MonoType *type, GString *str)
break;
}
case MONO_TYPE_SZARRAY:
- mono_type_get_name_recurse (type->data.type, str);
+ mono_type_get_name_recurse (&type->data.klass->byval_arg, str);
g_string_append (str, "[]");
break;
case MONO_TYPE_PTR:
@@ -4073,7 +4065,7 @@ mono_reflection_get_type_internal (MonoImage* image, MonoTypeNameParse *info, gb
} else if (modval == -1) {
klass = mono_ptr_class_get (&klass->byval_arg);
} else { /* array rank */
- klass = mono_array_class_get (&klass->byval_arg, modval);
+ klass = mono_array_class_get (klass, modval);
}
mono_class_init (klass);
}
@@ -4289,15 +4281,16 @@ handle_type:
case MONO_TYPE_SZARRAY:
{
MonoArray *arr;
- guint32 i, alen;
+ guint32 i, alen, basetype;
alen = read32 (p);
p += 4;
if (alen == 0xffffffff) {
*end = p;
return NULL;
}
- arr = mono_array_new (mono_domain_get(), mono_class_from_mono_type (t->data.type), alen);
- switch (t->data.type->type)
+ arr = mono_array_new (mono_domain_get(), t->data.klass, alen);
+ basetype = t->data.klass->byval_arg.type;
+ switch (basetype)
{
case MONO_TYPE_U1:
case MONO_TYPE_I1:
@@ -4978,7 +4971,7 @@ handle_type:
*p++ = (len >> 24) & 0xff;
*retp = p;
*retbuffer = buffer;
- eclass = mono_class_from_mono_type (type)->element_class;
+ eclass = type->data.klass;
for (i = 0; i < len; ++i) {
encode_cattr_value (buffer, p, &buffer, &p, buflen, &eclass->byval_arg, mono_array_get ((MonoArray*)arg, MonoObject*, i));
}