X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Ficall.c;h=07db51e1b4b64d669a1d13175ccbf11e77132608;hb=2d3954178a8676b0fb999b1005643dcbe48c68f4;hp=5d0adb0756a034a7315af2528cc1e7cef31879bc;hpb=2c47e928e357b86ed318d761aef6445babe583ff;p=mono.git diff --git a/mono/metadata/icall.c b/mono/metadata/icall.c index 5d0adb0756a..07db51e1b4b 100644 --- a/mono/metadata/icall.c +++ b/mono/metadata/icall.c @@ -78,8 +78,13 @@ mono_double_ParseImpl (char *ptr) MONO_ARCH_SAVE_REGS; +#ifdef __arm__ + if (*ptr) + result = strtod (ptr, &endptr); +#else if (*ptr) result = bsd_strtod (ptr, &endptr); +#endif if (!*ptr || (endptr && *endptr)) mono_raise_exception (mono_exception_from_name (mono_get_corlib (), @@ -629,6 +634,26 @@ ves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* d return TRUE; } +static void +ves_icall_System_Array_InternalArray_GetGenericValueImpl (MonoObject *this, guint32 pos, + gpointer value) +{ + MonoClass *ac; + MonoArray *ao; + gint32 esize; + gpointer *ea; + + MONO_ARCH_SAVE_REGS; + + ao = (MonoArray *)this; + ac = (MonoClass *)ao->obj.vtable->klass; + + esize = mono_array_element_size (ac); + ea = (gpointer*)((char*)ao->vector + (pos * esize)); + + memcpy (value, ea, esize); +} + static void ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_InitializeArray (MonoArray *array, MonoClassField *field_handle) { @@ -1002,7 +1027,7 @@ ves_icall_type_from_name (MonoString *name, g_free (str); if (type == NULL){ if (throwOnError) - mono_raise_exception (mono_get_exception_type_load (name)); + mono_raise_exception (mono_get_exception_type_load (name, NULL)); } return type; @@ -1298,6 +1323,7 @@ ves_icall_MonoField_GetValueInternal (MonoReflectionField *field, MonoObject *ob MonoClassField *cf = field->field; MonoClass *klass; MonoVTable *vtable; + MonoType *t; MonoDomain *domain = mono_object_domain (field); gchar *v; gboolean is_static = FALSE; @@ -1311,7 +1337,8 @@ ves_icall_MonoField_GetValueInternal (MonoReflectionField *field, MonoObject *ob mono_class_init (field->klass); - switch (cf->type->type) { + t = mono_type_get_underlying_type (cf->type); + switch (t->type) { case MONO_TYPE_STRING: case MONO_TYPE_OBJECT: case MONO_TYPE_CLASS: @@ -1334,11 +1361,11 @@ ves_icall_MonoField_GetValueInternal (MonoReflectionField *field, MonoObject *ob case MONO_TYPE_I8: case MONO_TYPE_R8: case MONO_TYPE_VALUETYPE: - is_ref = cf->type->byref; + is_ref = t->byref; break; default: g_error ("type 0x%x not handled in " - "ves_icall_Monofield_GetValue", cf->type->type); + "ves_icall_Monofield_GetValue", t->type); return NULL; } @@ -1412,6 +1439,13 @@ ves_icall_FieldInfo_SetValueInternal (MonoReflectionField *field, MonoObject *ob case MONO_TYPE_SZARRAY: /* Do nothing */ break; + case MONO_TYPE_GENERICINST: { + MonoGenericClass *gclass = cf->type->data.generic_class; + g_assert (!gclass->inst->is_open); + if (gclass->container_class->valuetype && (v != NULL)) + v += sizeof (MonoObject); + break; + } default: g_error ("type 0x%x not handled in " "ves_icall_FieldInfo_SetValueInternal", cf->type->type); @@ -1817,7 +1851,7 @@ ves_icall_Type_GetGenericTypeDefinition_impl (MonoReflectionType *type) } static MonoReflectionType* -ves_icall_Type_BindGenericParameters (MonoReflectionType *type, MonoArray *type_array) +ves_icall_Type_MakeGenericType (MonoReflectionType *type, MonoArray *type_array) { MonoType *geninst, **types; int i, count; @@ -1833,6 +1867,8 @@ ves_icall_Type_BindGenericParameters (MonoReflectionType *type, MonoArray *type_ } geninst = mono_reflection_bind_generic_parameters (type, count, types); + if (!geninst) + return NULL; return mono_type_get_object (mono_object_domain (type), geninst); } @@ -1847,6 +1883,16 @@ ves_icall_Type_get_IsGenericInstance (MonoReflectionType *type) return klass->generic_class != NULL; } +static gboolean +ves_icall_Type_get_IsGenericType (MonoReflectionType *type) +{ + MonoClass *klass; + MONO_ARCH_SAVE_REGS; + + klass = mono_class_from_mono_type (type->type); + return klass->generic_class != NULL || klass->generic_container != NULL; +} + static gint32 ves_icall_Type_GetGenericParameterPosition (MonoReflectionType *type) { @@ -1889,18 +1935,6 @@ ves_icall_Type_GetGenericParameterConstraints (MonoReflectionType *type) return res; } -static MonoBoolean -ves_icall_MonoType_get_HasGenericArguments (MonoReflectionType *type) -{ - MonoClass *klass; - MONO_ARCH_SAVE_REGS; - - klass = mono_class_from_mono_type (type->type); - if (klass->generic_container || klass->generic_class) - return TRUE; - return FALSE; -} - static MonoBoolean ves_icall_MonoType_get_IsGenericParameter (MonoReflectionType *type) { @@ -1931,13 +1965,15 @@ ves_icall_EnumBuilder_setup_enum_type (MonoReflectionType *enumtype, static MonoReflectionType* ves_icall_MonoGenericClass_GetParentType (MonoReflectionGenericClass *type) { - MonoGenericClass *gclass; + MonoDynamicGenericClass *gclass; MonoClass *klass; MONO_ARCH_SAVE_REGS; - gclass = type->type.type->data.generic_class; - if (!gclass || !gclass->parent || (gclass->parent->type != MONO_TYPE_GENERICINST)) + g_assert (type->type.type->data.generic_class->is_dynamic); + gclass = (MonoDynamicGenericClass *) type->type.type->data.generic_class; + + if (!gclass->parent || (gclass->parent->type != MONO_TYPE_GENERICINST)) return NULL; klass = mono_class_from_mono_type (gclass->parent); @@ -1951,7 +1987,7 @@ static MonoArray* ves_icall_MonoGenericClass_GetInterfaces (MonoReflectionGenericClass *type) { static MonoClass *System_Reflection_MonoGenericClass; - MonoGenericClass *gclass; + MonoDynamicGenericClass *gclass; MonoDomain *domain; MonoClass *klass; MonoArray *res; @@ -1967,11 +2003,12 @@ ves_icall_MonoGenericClass_GetInterfaces (MonoReflectionGenericClass *type) domain = mono_object_domain (type); - gclass = type->type.type->data.generic_class; - if (!gclass || !gclass->ifaces) + g_assert (type->type.type->data.generic_class->is_dynamic); + gclass = (MonoDynamicGenericClass *) type->type.type->data.generic_class; + if (!gclass->ifaces) return mono_array_new (domain, System_Reflection_MonoGenericClass, 0); - klass = gclass->container_class; + klass = gclass->generic_class.generic_class.container_class; res = mono_array_new (domain, System_Reflection_MonoGenericClass, gclass->count_ifaces); @@ -1987,7 +2024,7 @@ ves_icall_MonoGenericClass_GetInterfaces (MonoReflectionGenericClass *type) static MonoReflectionMethod* ves_icall_MonoGenericClass_GetCorrespondingInflatedMethod (MonoReflectionGenericClass *type, - MonoMethod* generic) + MonoReflectionMethod* generic) { MonoGenericClass *gclass; MonoDynamicGenericClass *dgclass; @@ -2004,7 +2041,7 @@ ves_icall_MonoGenericClass_GetCorrespondingInflatedMethod (MonoReflectionGeneric domain = mono_object_domain (type); for (i = 0; i < dgclass->count_methods; i++) - if (generic->token == dgclass->methods [i]->token) + if (generic->method->token == dgclass->methods [i]->token) return mono_method_get_object (domain, dgclass->methods [i], NULL); return NULL; @@ -2012,7 +2049,7 @@ ves_icall_MonoGenericClass_GetCorrespondingInflatedMethod (MonoReflectionGeneric static MonoReflectionMethod* ves_icall_MonoGenericClass_GetCorrespondingInflatedConstructor (MonoReflectionGenericClass *type, - MonoMethod* generic) + MonoReflectionMethod* generic) { MonoGenericClass *gclass; MonoDynamicGenericClass *dgclass; @@ -2029,7 +2066,7 @@ ves_icall_MonoGenericClass_GetCorrespondingInflatedConstructor (MonoReflectionGe domain = mono_object_domain (type); for (i = 0; i < dgclass->count_ctors; i++) - if (generic->token == dgclass->ctors [i]->token) + if (generic->method->token == dgclass->ctors [i]->token) return mono_method_get_object (domain, dgclass->ctors [i], NULL); return NULL; @@ -2038,12 +2075,13 @@ ves_icall_MonoGenericClass_GetCorrespondingInflatedConstructor (MonoReflectionGe static MonoReflectionField* ves_icall_MonoGenericClass_GetCorrespondingInflatedField (MonoReflectionGenericClass *type, - MonoClassField* generic) + MonoString* generic_name) { MonoGenericClass *gclass; MonoDynamicGenericClass *dgclass; MonoDomain *domain; MonoClass *refclass; + char *utf8_name = mono_string_to_utf8 (generic_name); int i; MONO_ARCH_SAVE_REGS; @@ -2058,8 +2096,12 @@ ves_icall_MonoGenericClass_GetCorrespondingInflatedField (MonoReflectionGenericC domain = mono_object_domain (type); for (i = 0; i < dgclass->count_fields; i++) - if (strcmp (generic->name, dgclass->fields [i].name) == 0) + if (strcmp (utf8_name, dgclass->fields [i].name) == 0) { + g_free (utf8_name); return mono_field_get_object (domain, refclass, &dgclass->fields [i]); + } + + g_free (utf8_name); return NULL; } @@ -2067,7 +2109,7 @@ ves_icall_MonoGenericClass_GetCorrespondingInflatedField (MonoReflectionGenericC static MonoReflectionMethod* ves_icall_MonoType_GetCorrespondingInflatedMethod (MonoReflectionType *type, - MonoMethod* generic) + MonoReflectionMethod* generic) { MonoDomain *domain; MonoClass *klass; @@ -2082,39 +2124,13 @@ ves_icall_MonoType_GetCorrespondingInflatedMethod (MonoReflectionType *type, iter = NULL; while ((method = mono_class_get_methods (klass, &iter))) { - if (method->token == generic->token) + if (method->token == generic->method->token) return mono_method_get_object (domain, method, klass); } return NULL; } - -static MonoReflectionField* -ves_icall_MonoType_GetCorrespondingInflatedField (MonoReflectionType *type, - MonoClassField* generic) -{ - MonoDomain *domain; - MonoClass *klass; - MonoClassField *field; - gpointer iter; - - MONO_ARCH_SAVE_REGS; - - domain = ((MonoObject *)type)->vtable->domain; - - klass = mono_class_from_mono_type (type->type); - - iter = NULL; - while ((field = mono_class_get_fields (klass, &iter))) { - if (field->name == generic->name) - return mono_field_get_object (domain, klass, field); - } - - return NULL; -} - - static MonoArray* ves_icall_MonoGenericClass_GetMethods (MonoReflectionGenericClass *type, MonoReflectionType *reflected_type) @@ -2561,7 +2577,6 @@ ves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this, MonoA else result = *((gpointer *)((char *)this + field->offset)); - g_assert (result); out_args = mono_array_new (domain, mono_defaults.object_class, 1); *outArgs = out_args; mono_array_set (out_args, gpointer, 0, result); @@ -2851,7 +2866,7 @@ handle_parent: } g_free (utf8_name); - return mono_field_get_object (domain, startklass, field); + return mono_field_get_object (domain, klass, field); } if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent)) goto handle_parent; @@ -2957,6 +2972,7 @@ ves_icall_Type_GetMethodsByName (MonoReflectionType *type, MonoString *name, gui memset (method_slots, 0, sizeof (method_slots_default)); } handle_parent: + mono_class_setup_vtable (klass); iter = NULL; while ((method = mono_class_get_methods (klass, &iter))) { match = 0; @@ -3123,6 +3139,7 @@ ves_icall_Type_GetPropertiesByName (MonoReflectionType *type, MonoString *name, memset (method_slots, 0, sizeof (method_slots_default)); } handle_parent: + mono_class_setup_vtable (klass); iter = NULL; while ((prop = mono_class_get_properties (klass, &iter))) { match = 0; @@ -3428,7 +3445,7 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as g_list_free (info.modifiers); g_list_free (info.nested); if (throwOnError) /* uhm: this is a parse error, though... */ - mono_raise_exception (mono_get_exception_type_load (name)); + mono_raise_exception (mono_get_exception_type_load (name, NULL)); /*g_print ("failed parse\n");*/ return NULL; } @@ -3471,7 +3488,7 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as g_list_free (info.nested); if (!type) { if (throwOnError) - mono_raise_exception (mono_get_exception_type_load (name)); + mono_raise_exception (mono_get_exception_type_load (name, NULL)); /* g_print ("failed find\n"); */ return NULL; } @@ -3607,12 +3624,11 @@ ves_icall_System_Reflection_Assembly_GetManifestResourceNames (MonoReflectionAss } static MonoObject* -create_version (MonoDomain *domain, MonoAssemblyName *aname) +create_version (MonoDomain *domain, guint32 major, guint32 minor, guint32 build, guint32 revision) { static MonoClass *System_Version = NULL; static MonoMethod *create_version = NULL; MonoObject *result; - int major, minor, build, revision; gpointer args [4]; if (!System_Version) { @@ -3627,10 +3643,6 @@ create_version (MonoDomain *domain, MonoAssemblyName *aname) mono_method_desc_free (desc); } - major = aname->major; - minor = aname->minor; - build = aname->build; - revision = aname->revision; args [0] = &major; args [1] = &minor; args [2] = &build; @@ -3649,6 +3661,7 @@ ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAsse MonoDomain *domain = mono_object_domain (assembly); int i, count = 0; static MonoMethod *create_culture = NULL; + MonoImage *image = assembly->assembly->image; MonoTableInfo *t; MONO_ARCH_SAVE_REGS; @@ -3671,52 +3684,46 @@ ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAsse } for (i = 0; i < count; i++) { - MonoAssembly *assem; MonoReflectionAssemblyName *aname; + guint32 cols [MONO_ASSEMBLYREF_SIZE]; - /* FIXME: There is no need to load the assemblies themselves */ - mono_assembly_load_reference (assembly->assembly->image, i); - - assem = assembly->assembly->image->references [i]; - if (assem == (gpointer)-1) { - char *msg = g_strdup_printf ("Assembly %d referenced from assembly %s not found ", i, assembly->assembly->image->name); - MonoException *ex = mono_get_exception_file_not_found2 (msg, NULL); - g_free (msg); - mono_raise_exception (ex); - } + mono_metadata_decode_row (t, i, cols, MONO_ASSEMBLYREF_SIZE); aname = (MonoReflectionAssemblyName *) mono_object_new ( domain, System_Reflection_AssemblyName); - aname->name = mono_string_new (domain, assem->aname.name); + aname->name = mono_string_new (domain, mono_metadata_string_heap (image, cols [MONO_ASSEMBLYREF_NAME])); - aname->major = assem->aname.major; - aname->minor = assem->aname.minor; - aname->build = assem->aname.build; - aname->revision = assem->aname.revision; - aname->hashalg = assem->aname.hash_alg; - aname->flags = assem->aname.flags; + aname->major = cols [MONO_ASSEMBLYREF_MAJOR_VERSION]; + aname->minor = cols [MONO_ASSEMBLYREF_MINOR_VERSION]; + aname->build = cols [MONO_ASSEMBLYREF_BUILD_NUMBER]; + aname->revision = cols [MONO_ASSEMBLYREF_REV_NUMBER]; + aname->flags = cols [MONO_ASSEMBLYREF_FLAGS]; aname->versioncompat = 1; /* SameMachine (default) */ - aname->version = create_version (domain, &assem->aname); + aname->hashalg = ASSEMBLY_HASH_SHA1; /* SHA1 (default) */ + aname->version = create_version (domain, aname->major, aname->minor, aname->build, aname->revision); if (create_culture) { gpointer args [1]; - args [0] = mono_string_new (domain, assem->aname.culture); + args [0] = mono_string_new (domain, mono_metadata_string_heap (image, cols [MONO_ASSEMBLYREF_CULTURE])); aname->cultureInfo = mono_runtime_invoke (create_culture, NULL, args, NULL); } - - if (assem->aname.public_key) { - guint32 pkey_len; - const char *pkey_ptr = (char*)assem->aname.public_key; - pkey_len = mono_metadata_decode_blob_size (pkey_ptr, &pkey_ptr); - - aname->publicKey = mono_array_new (domain, mono_defaults.byte_class, pkey_len); - memcpy (mono_array_addr (aname->publicKey, guint8, 0), pkey_ptr, pkey_len); + + if (cols [MONO_ASSEMBLYREF_PUBLIC_KEY]) { + const gchar *pkey_ptr = mono_metadata_blob_heap (image, cols [MONO_ASSEMBLYREF_PUBLIC_KEY]); + guint32 pkey_len = mono_metadata_decode_blob_size (pkey_ptr, &pkey_ptr); + + if ((cols [MONO_ASSEMBLYREF_FLAGS] & ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG)) { + /* public key token isn't copied - the class library will + automatically generate it from the public key if required */ + aname->publicKey = mono_array_new (domain, mono_defaults.byte_class, pkey_len); + memcpy (mono_array_addr (aname->publicKey, guint8, 0), pkey_ptr, pkey_len); + } else { + aname->keyToken = mono_array_new (domain, mono_defaults.byte_class, pkey_len); + memcpy (mono_array_addr (aname->keyToken, guint8, 0), pkey_ptr, pkey_len); + } } - - /* public key token isn't copied - the class library will - automatically generate it from the public key if required */ - + /* note: this function doesn't return the codebase on purpose (i.e. it can be used under partial trust as path information isn't present). */ @@ -4077,18 +4084,26 @@ ves_icall_System_Reflection_Assembly_GetCallingAssembly (void) } static MonoString * -ves_icall_System_MonoType_getFullName (MonoReflectionType *object, gboolean full_name) +ves_icall_System_MonoType_getFullName (MonoReflectionType *object, gboolean full_name, + gboolean assembly_qualified) { MonoDomain *domain = mono_object_domain (object); + MonoTypeNameFormat format; MonoString *res; gchar *name; MONO_ARCH_SAVE_REGS; - if (full_name) - name = mono_type_get_full_name (object->type); + format = assembly_qualified ? + MONO_TYPE_NAME_FORMAT_ASSEMBLY_QUALIFIED : + MONO_TYPE_NAME_FORMAT_FULL_NAME; else - name = mono_type_get_name (object->type); + format = MONO_TYPE_NAME_FORMAT_REFLECTION; + + name = mono_type_get_name_full (object->type, format); + if (!name) + return NULL; + res = mono_string_new (domain, name); g_free (name); @@ -4096,7 +4111,7 @@ ves_icall_System_MonoType_getFullName (MonoReflectionType *object, gboolean full } static void -fill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *aname, MonoAssemblyName *name, const char *absolute) +fill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *aname, MonoAssemblyName *name, const char *absolute, gboolean by_default_version) { static MonoMethod *create_culture = NULL; gpointer args [1]; @@ -4112,7 +4127,8 @@ fill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *a aname->build = name->build; aname->revision = name->revision; aname->hashalg = name->hash_alg; - aname->version = create_version (domain, name); + if (by_default_version) + aname->version = create_version (domain, name->major, name->minor, name->build, name->revision); codebase = g_filename_to_uri (absolute, NULL, NULL); if (codebase) { @@ -4127,9 +4143,10 @@ fill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *a mono_method_desc_free (desc); } - args [0] = mono_string_new (domain, name->culture); - aname->cultureInfo = - mono_runtime_invoke (create_culture, NULL, args, NULL); + if (name->culture) { + args [0] = mono_string_new (domain, name->culture); + aname->cultureInfo = mono_runtime_invoke (create_culture, NULL, args, NULL); + } if (name->public_key) { pkey_ptr = (char*)name->public_key; @@ -4165,7 +4182,7 @@ ves_icall_System_Reflection_Assembly_FillName (MonoReflectionAssembly *assembly, absolute = g_build_filename (assembly->assembly->basedir, assembly->assembly->image->module_name, NULL); fill_reflection_assembly_name (mono_object_domain (assembly), aname, - &assembly->assembly->aname, absolute); + &assembly->assembly->aname, absolute, TRUE); g_free (absolute); } @@ -4200,7 +4217,7 @@ ves_icall_System_Reflection_Assembly_InternalGetAssemblyName (MonoString *fname, mono_raise_exception (mono_get_exception_argument ("assemblyFile", "The file does not contain a manifest")); } - fill_reflection_assembly_name (mono_domain_get (), aname, &name, filename); + fill_reflection_assembly_name (mono_domain_get (), aname, &name, filename, TRUE); g_free (filename); mono_image_close (image); @@ -4420,6 +4437,27 @@ ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly, return res; } +static gboolean +ves_icall_System_Reflection_AssemblyName_ParseName (MonoReflectionAssemblyName *name, MonoString *assname) +{ + MonoAssemblyName aname; + MonoDomain *domain = mono_object_domain (name); + char *val; + gboolean is_version_defined; + + val = mono_string_to_utf8 (assname); + if (!mono_assembly_name_parse_full (val, &aname, TRUE, &is_version_defined)) + return FALSE; + + fill_reflection_assembly_name (domain, name, &aname, "", is_version_defined); + + mono_assembly_name_free (&aname); + g_free ((guint8*) aname.public_key); + g_free (val); + + return TRUE; +} + static MonoReflectionType* ves_icall_System_Reflection_Module_GetGlobalType (MonoReflectionModule *module) { @@ -5935,56 +5973,10 @@ ves_icall_System_Char_GetDataTablePointers (guint8 const **category_data, *to_upper_data_high = ToUpperDataHigh; } -static MonoString * -ves_icall_MonoDebugger_check_runtime_version (MonoString *fname) -{ - gchar *filename, *error = NULL; - - MONO_ARCH_SAVE_REGS; - - filename = mono_string_to_utf8 (fname); - error = mono_debugger_check_runtime_version (filename); - g_free (filename); - - if (error) - return mono_string_new (mono_domain_get (), error); - else - return NULL; -} - static gint32 -ves_icall_MonoDebugger_GetMethodIndex (MonoReflectionMethod *rmethod) +ves_icall_MonoDebugger_GetMethodToken (MonoReflectionMethod *method) { - guint32 index; - - MONO_ARCH_SAVE_REGS; - - index = mono_method_get_index (rmethod->method); - if (!index) - return -1; - - return index - rmethod->method->klass->method.first; -} - -static MonoReflectionType* -ves_icall_MonoDebugger_MakeArrayType (MonoReflectionType *type, int rank) -{ - MonoClass *klass, *aklass; - - MONO_ARCH_SAVE_REGS; - - klass = mono_class_from_mono_type (type->type); - aklass = mono_array_class_get (klass, rank); - - return mono_type_get_object (mono_object_domain (type), &aklass->byval_arg); -} - -static int -ves_icall_MonoDebugger_GetTypeToken (MonoObject *obj) -{ - MONO_ARCH_SAVE_REGS; - - return mono_reflection_get_token (obj); + return method->method->token; } static MonoBoolean @@ -6002,6 +5994,12 @@ custom_attrs_defined_internal (MonoObject *obj, MonoReflectionType *attr_type) return found; } +static MonoArray* +custom_attrs_get_by_type (MonoObject *obj, MonoReflectionType *attr_type) +{ + return mono_reflection_get_custom_attrs_by_type (obj, attr_type ? mono_class_from_mono_type (attr_type->type) : NULL); +} + static MonoBoolean GCHandle_CheckCurrentDomain (guint32 gchandle) { @@ -6029,11 +6027,12 @@ static guchar dbase64 [] = { }; static MonoArray * -base64_to_byte_array (gunichar2 *start, gint ilength) +base64_to_byte_array (gunichar2 *start, gint ilength, MonoBoolean allowWhitespaceOnly) { gint ignored; gint i; gunichar2 c; + gunichar2 last, prev_last; gint olength; MonoArray *result; guchar *res_ptr; @@ -6041,19 +6040,28 @@ base64_to_byte_array (gunichar2 *start, gint ilength) MonoException *exc; ignored = 0; + last = prev_last = 0; for (i = 0; i < ilength; i++) { c = start [i]; - if (isspace (c)) { - ignored++; - } else if (c >= sizeof (dbase64)) { + if (c >= sizeof (dbase64)) { exc = mono_exception_from_name_msg (mono_get_corlib (), "System", "FormatException", "Invalid character found."); mono_raise_exception (exc); + } else if (isspace (c)) { + ignored++; + } else { + prev_last = last; + last = c; } } olength = ilength - ignored; + + if (allowWhitespaceOnly && olength == 0) { + return mono_array_new (mono_domain_get (), mono_defaults.byte_class, 0); + } + if ((olength & 3) != 0 || olength <= 0) { exc = mono_exception_from_name_msg (mono_get_corlib (), "System", "FormatException", "Invalid length."); @@ -6061,10 +6069,10 @@ base64_to_byte_array (gunichar2 *start, gint ilength) } olength = (olength * 3) / 4; - if (start [ilength - 1] == '=') + if (last == '=') olength--; - if (start [ilength - 2] == '=') + if (prev_last == '=') olength--; result = mono_array_new (mono_domain_get (), mono_defaults.byte_class, olength); @@ -6072,11 +6080,11 @@ base64_to_byte_array (gunichar2 *start, gint ilength) for (i = 0; i < ilength; ) { int k; - for (k = 0; k < 4 && i < ilength; k++) { + for (k = 0; k < 4 && i < ilength;) { c = start [i++]; if (isspace (c)) continue; - + a [k] = (guchar) c; if (((b [k] = dbase64 [c]) & 0x80) != 0) { exc = mono_exception_from_name_msg (mono_get_corlib (), @@ -6084,6 +6092,7 @@ base64_to_byte_array (gunichar2 *start, gint ilength) "Invalid character found."); mono_raise_exception (exc); } + k++; } *res_ptr++ = (b [0] << 2) | (b [1] >> 4); @@ -6100,11 +6109,12 @@ base64_to_byte_array (gunichar2 *start, gint ilength) } static MonoArray * -InternalFromBase64String (MonoString *str) +InternalFromBase64String (MonoString *str, MonoBoolean allowWhitespaceOnly) { MONO_ARCH_SAVE_REGS; - return base64_to_byte_array (mono_string_chars (str), mono_string_length (str)); + return base64_to_byte_array (mono_string_chars (str), + mono_string_length (str), allowWhitespaceOnly); } static MonoArray * @@ -6112,7 +6122,8 @@ InternalFromBase64CharArray (MonoArray *input, gint offset, gint length) { MONO_ARCH_SAVE_REGS; - return base64_to_byte_array (mono_array_addr (input, gunichar2, offset), length); + return base64_to_byte_array (mono_array_addr (input, gunichar2, offset), + length, FALSE); } /* icall map */ @@ -6309,6 +6320,11 @@ static const IcallEntry cultureinfo_icalls [] = { {"internal_is_lcid_neutral", ves_icall_System_Globalization_CultureInfo_internal_is_lcid_neutral} }; +static const IcallEntry regioninfo_icalls [] = { + {"construct_internal_region_from_lcid", ves_icall_System_Globalization_RegionInfo_construct_internal_region_from_lcid}, + {"construct_internal_region_from_name", ves_icall_System_Globalization_RegionInfo_construct_internal_region_from_name} +}; + static const IcallEntry compareinfo_icalls [] = { {"assign_sortkey(object,string,System.Globalization.CompareOptions)", ves_icall_System_Globalization_CompareInfo_assign_sortkey}, {"construct_compareinfo(string)", ves_icall_System_Globalization_CompareInfo_construct_compareinfo}, @@ -6348,13 +6364,11 @@ static const IcallEntry monoio_icalls [] = { {"CreateDirectory(string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_CreateDirectory}, {"CreatePipe(intptr&,intptr&)", ves_icall_System_IO_MonoIO_CreatePipe}, {"DeleteFile(string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_DeleteFile}, - {"FindClose(intptr,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_FindClose}, - {"FindFirstFile(string,System.IO.MonoIOStat&,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_FindFirstFile}, - {"FindNextFile(intptr,System.IO.MonoIOStat&,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_FindNextFile}, {"Flush(intptr,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Flush}, {"GetCurrentDirectory(System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_GetCurrentDirectory}, {"GetFileAttributes(string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_GetFileAttributes}, {"GetFileStat(string,System.IO.MonoIOStat&,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_GetFileStat}, + {"GetFileSystemEntries", ves_icall_System_IO_MonoIO_GetFileSystemEntries}, {"GetFileType(intptr,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_GetFileType}, {"GetLength(intptr,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_GetLength}, {"GetTempPath(string&)", ves_icall_System_IO_MonoIO_GetTempPath}, @@ -6403,7 +6417,7 @@ static const IcallEntry math_icalls [] = { static const IcallEntry customattrs_icalls [] = { {"GetCustomAttributesDataInternal", mono_reflection_get_custom_attrs_data}, - {"GetCustomAttributesInternal", mono_reflection_get_custom_attrs}, + {"GetCustomAttributesInternal", custom_attrs_get_by_type}, {"IsDefinedInternal", custom_attrs_defined_internal} }; @@ -6425,7 +6439,6 @@ static const IcallEntry monotype_icalls [] = { {"GetConstructors", ves_icall_Type_GetConstructors_internal}, {"GetConstructors_internal", ves_icall_Type_GetConstructors_internal}, {"GetCorrespondingInflatedConstructor", ves_icall_MonoType_GetCorrespondingInflatedMethod}, - {"GetCorrespondingInflatedField", ves_icall_MonoType_GetCorrespondingInflatedField}, {"GetCorrespondingInflatedMethod", ves_icall_MonoType_GetCorrespondingInflatedMethod}, {"GetElementType", ves_icall_MonoType_GetElementType}, {"GetEvents_internal", ves_icall_Type_GetEvents_internal}, @@ -6446,7 +6459,6 @@ static const IcallEntry monotype_icalls [] = { {"get_BaseType", ves_icall_get_type_parent}, {"get_DeclaringMethod", ves_icall_MonoType_get_DeclaringMethod}, {"get_DeclaringType", ves_icall_MonoType_get_DeclaringType}, - {"get_HasGenericArguments", ves_icall_MonoType_get_HasGenericArguments}, {"get_IsGenericParameter", ves_icall_MonoType_get_IsGenericParameter}, {"get_Module", ves_icall_MonoType_get_Module}, {"get_Name", ves_icall_MonoType_get_Name}, @@ -6477,14 +6489,7 @@ static const IcallEntry assembly_icalls [] = { /* * Private icalls for the Mono Debugger */ - {"MonoDebugger_CheckRuntimeVersion", ves_icall_MonoDebugger_check_runtime_version}, - {"MonoDebugger_GetLocalTypeFromSignature", ves_icall_MonoDebugger_GetLocalTypeFromSignature}, - {"MonoDebugger_GetMethod", ves_icall_MonoDebugger_GetMethod}, - {"MonoDebugger_GetMethodIndex", ves_icall_MonoDebugger_GetMethodIndex}, {"MonoDebugger_GetMethodToken", ves_icall_MonoDebugger_GetMethodToken}, - {"MonoDebugger_GetType", ves_icall_MonoDebugger_GetType}, - {"MonoDebugger_GetTypeToken", ves_icall_MonoDebugger_GetTypeToken}, - {"MonoDebugger_MakeArrayType", ves_icall_MonoDebugger_MakeArrayType}, /* normal icalls again */ {"get_EntryPoint", ves_icall_System_Reflection_Assembly_get_EntryPoint}, @@ -6497,6 +6502,10 @@ static const IcallEntry assembly_icalls [] = { {"load_with_partial_name", ves_icall_System_Reflection_Assembly_load_with_partial_name} }; +static const IcallEntry assembly_name_icalls [] = { + {"ParseName", ves_icall_System_Reflection_AssemblyName_ParseName} +}; + static const IcallEntry methodbase_icalls [] = { {"GetCurrentMethod", ves_icall_GetCurrentMethod}, {"GetMethodBodyInternal", ves_icall_System_Reflection_MethodBase_GetMethodBodyInternal}, @@ -6558,11 +6567,11 @@ static const IcallEntry generictypeparambuilder_icalls [] = { }; static const IcallEntry monomethod_icalls [] = { - {"BindGenericParameters", mono_reflection_bind_generic_method_parameters}, {"GetDllImportAttribute", ves_icall_MonoMethod_GetDllImportAttribute}, {"GetGenericArguments", ves_icall_MonoMethod_GetGenericArguments}, {"GetGenericMethodDefinition_impl", ves_icall_MonoMethod_GetGenericMethodDefinition}, {"InternalInvoke", ves_icall_InternalInvoke}, + {"MakeGenericMethod", mono_reflection_bind_generic_method_parameters}, {"get_HasGenericParameters", ves_icall_MonoMethod_get_HasGenericParameters}, {"get_IsGenericMethodDefinition", ves_icall_MonoMethod_get_IsGenericMethodDefinition}, {"get_Mono_IsInflatedMethod", ves_icall_MonoMethod_get_Mono_IsInflatedMethod}, @@ -6637,7 +6646,7 @@ static const IcallEntry dynamicmethod_icalls [] = { }; static const IcallEntry methodbuilder_icalls [] = { - {"BindGenericParameters", mono_reflection_bind_generic_method_parameters} + {"MakeGenericMethod", mono_reflection_bind_generic_method_parameters} }; static const IcallEntry modulebuilder_icalls [] = { @@ -6849,6 +6858,7 @@ static const IcallEntry thread_icalls [] = { {"GetSerializedCurrentUICulture", ves_icall_System_Threading_Thread_GetSerializedCurrentUICulture}, {"GetState", ves_icall_System_Threading_Thread_GetState}, {"Join_internal", ves_icall_System_Threading_Thread_Join_internal}, + {"MemoryBarrier", ves_icall_System_Threading_Thread_MemoryBarrier}, {"ResetAbort_internal()", ves_icall_System_Threading_Thread_ResetAbort}, {"Resume_internal()", ves_icall_System_Threading_Thread_Resume}, {"SetCachedCurrentCulture", ves_icall_System_Threading_Thread_SetCachedCurrentCulture}, @@ -6904,7 +6914,6 @@ static const IcallEntry waithandle_icalls [] = { }; static const IcallEntry type_icalls [] = { - {"BindGenericParameters", ves_icall_Type_BindGenericParameters}, {"Equals", ves_icall_type_Equals}, {"GetGenericParameterAttributes", ves_icall_Type_GetGenericParameterAttributes}, {"GetGenericParameterConstraints_impl", ves_icall_Type_GetGenericParameterConstraints}, @@ -6916,8 +6925,10 @@ static const IcallEntry type_icalls [] = { {"GetTypeCodeInternal", ves_icall_type_GetTypeCodeInternal}, {"IsArrayImpl", ves_icall_Type_IsArrayImpl}, {"IsInstanceOfType", ves_icall_type_IsInstanceOfType}, + {"MakeGenericType", ves_icall_Type_MakeGenericType}, {"MakePointerType", ves_icall_Type_MakePointerType}, {"get_IsGenericInstance", ves_icall_Type_get_IsGenericInstance}, + {"get_IsGenericType", ves_icall_Type_get_IsGenericType}, {"get_IsGenericTypeDefinition", ves_icall_Type_get_IsGenericTypeDefinition}, {"internal_from_handle", ves_icall_type_from_handle}, {"internal_from_name", ves_icall_type_from_name}, @@ -6981,6 +6992,10 @@ static const IcallEntry securitymanager_icalls [] = { {"set_SecurityEnabled", ves_icall_System_Security_SecurityManager_set_SecurityEnabled} }; +static const IcallEntry generic_array_icalls [] = { + {"GetGenericValueImpl", ves_icall_System_Array_InternalArray_GetGenericValueImpl} +}; + /* proto static const IcallEntry array_icalls [] = { }; @@ -6995,6 +7010,7 @@ static const IcallMap icall_entries [] = { {"System.AppDomain", appdomain_icalls, G_N_ELEMENTS (appdomain_icalls)}, {"System.ArgIterator", argiterator_icalls, G_N_ELEMENTS (argiterator_icalls)}, {"System.Array", array_icalls, G_N_ELEMENTS (array_icalls)}, + {"System.Array/InternalArray`1", generic_array_icalls, G_N_ELEMENTS (generic_array_icalls)}, {"System.Buffer", buffer_icalls, G_N_ELEMENTS (buffer_icalls)}, {"System.Char", char_icalls, G_N_ELEMENTS (char_icalls)}, {"System.Configuration.DefaultConfig", defaultconf_icalls, G_N_ELEMENTS (defaultconf_icalls)}, @@ -7015,6 +7031,7 @@ static const IcallMap icall_entries [] = { {"System.GC", gc_icalls, G_N_ELEMENTS (gc_icalls)}, {"System.Globalization.CompareInfo", compareinfo_icalls, G_N_ELEMENTS (compareinfo_icalls)}, {"System.Globalization.CultureInfo", cultureinfo_icalls, G_N_ELEMENTS (cultureinfo_icalls)}, + {"System.Globalization.RegionInfo", regioninfo_icalls, G_N_ELEMENTS (regioninfo_icalls)}, {"System.IO.FAMWatcher", famwatcher_icalls, G_N_ELEMENTS (famwatcher_icalls)}, {"System.IO.FileSystemWatcher", filewatcher_icalls, G_N_ELEMENTS (filewatcher_icalls)}, {"System.IO.MonoIO", monoio_icalls, G_N_ELEMENTS (monoio_icalls)}, @@ -7028,6 +7045,7 @@ static const IcallMap icall_entries [] = { {"System.Net.Sockets.SocketException", socketex_icalls, G_N_ELEMENTS (socketex_icalls)}, {"System.Object", object_icalls, G_N_ELEMENTS (object_icalls)}, {"System.Reflection.Assembly", assembly_icalls, G_N_ELEMENTS (assembly_icalls)}, + {"System.Reflection.AssemblyName", assembly_name_icalls, G_N_ELEMENTS (assembly_name_icalls)}, {"System.Reflection.Emit.AssemblyBuilder", assemblybuilder_icalls, G_N_ELEMENTS (assemblybuilder_icalls)}, {"System.Reflection.Emit.CustomAttributeBuilder", customattrbuilder_icalls, G_N_ELEMENTS (customattrbuilder_icalls)}, {"System.Reflection.Emit.DynamicMethod", dynamicmethod_icalls, G_N_ELEMENTS (dynamicmethod_icalls)}, @@ -7195,9 +7213,24 @@ mono_lookup_internal_call (MonoMethod *method) g_assert (method != NULL); - typelen = concat_class_name (mname, sizeof (mname), method->klass); - if (!typelen) - return NULL; + if (method->klass->nested_in) { + int pos = concat_class_name (mname, sizeof (mname)-2, method->klass->nested_in); + if (!pos) + return NULL; + + mname [pos++] = '/'; + mname [pos] = 0; + + typelen = concat_class_name (mname+pos, sizeof (mname)-pos-1, method->klass); + if (!typelen) + return NULL; + + typelen += pos; + } else { + typelen = concat_class_name (mname, sizeof (mname), method->klass); + if (!typelen) + return NULL; + } imap = find_class_icalls (mname);