diff options
author | Paolo Molaro <lupus@oddwiz.org> | 2003-07-18 15:27:24 +0400 |
---|---|---|
committer | Paolo Molaro <lupus@oddwiz.org> | 2003-07-18 15:27:24 +0400 |
commit | 0e226477f8fdf11b64bd46d7a414ccf51afee4b8 (patch) | |
tree | 695a43df63cd4fb54faab56e3f6d0b09169754ea | |
parent | b8f111e8e8320f6f968d10b498f493504ae1fec3 (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/ChangeLog | 6 | ||||
-rw-r--r-- | mono/metadata/class.c | 22 | ||||
-rw-r--r-- | mono/metadata/class.h | 2 | ||||
-rw-r--r-- | mono/metadata/debug-helpers.c | 32 | ||||
-rw-r--r-- | mono/metadata/icall.c | 6 | ||||
-rw-r--r-- | mono/metadata/image.c | 3 | ||||
-rw-r--r-- | mono/metadata/marshal.c | 4 | ||||
-rw-r--r-- | mono/metadata/metadata.c | 34 | ||||
-rw-r--r-- | mono/metadata/metadata.h | 4 | ||||
-rw-r--r-- | mono/metadata/mono-debug-debugger.c | 4 | ||||
-rw-r--r-- | mono/metadata/object.c | 2 | ||||
-rw-r--r-- | mono/metadata/reflection.c | 39 |
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)); } |