X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Ficall.c;h=545d7608c14d0d1aa478f39ff372554dd7e21625;hb=aef0b3e04cdb066aa84ecb9ac1770c0aa936d150;hp=e3241865924fdf0a556d48d22c0d07aed1920b10;hpb=e4aa060bea5bc82362b9ea2c66de4c8da782a061;p=mono.git diff --git a/mono/metadata/icall.c b/mono/metadata/icall.c index e3241865924..545d7608c14 100644 --- a/mono/metadata/icall.c +++ b/mono/metadata/icall.c @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -94,7 +95,7 @@ #include #include #endif -#include "decimal.h" +#include "decimal-ms.h" extern MonoString* ves_icall_System_Environment_GetOSVersionString (void) MONO_INTERNAL; @@ -125,8 +126,6 @@ mono_double_ParseImpl (char *ptr, double *result) gchar *endptr = NULL; *result = 0.0; - MONO_ARCH_SAVE_REGS; - if (*ptr){ /* mono_strtod () is not thread-safe */ mono_mutex_lock (&mono_strtod_mutex); @@ -148,8 +147,6 @@ ves_icall_System_Array_GetValueImpl (MonoObject *this, guint32 pos) gint32 esize; gpointer *ea; - MONO_ARCH_SAVE_REGS; - ao = (MonoArray *)this; ac = (MonoClass *)ao->obj.vtable->klass; @@ -169,8 +166,6 @@ ves_icall_System_Array_GetValue (MonoObject *this, MonoObject *idxs) MonoArray *ao, *io; gint32 i, pos, *ind; - MONO_ARCH_SAVE_REGS; - MONO_CHECK_ARG_NULL (idxs); io = (MonoArray *)idxs; @@ -217,8 +212,6 @@ ves_icall_System_Array_SetValueImpl (MonoArray *this, MonoObject *value, guint32 gint64 i64 = 0; gdouble r64 = 0; - MONO_ARCH_SAVE_REGS; - if (value) vc = value->vtable->klass; else @@ -490,8 +483,6 @@ ves_icall_System_Array_SetValue (MonoArray *this, MonoObject *value, MonoClass *ac, *ic; gint32 i, pos, *ind; - MONO_ARCH_SAVE_REGS; - MONO_CHECK_ARG_NULL (idxs); ic = idxs->obj.vtable->klass; @@ -532,8 +523,6 @@ ves_icall_System_Array_CreateInstanceImpl (MonoReflectionType *type, MonoArray * uintptr_t *sizes, i; gboolean bounded = FALSE; - MONO_ARCH_SAVE_REGS; - MONO_CHECK_ARG_NULL (type); MONO_CHECK_ARG_NULL (lengths); @@ -578,8 +567,6 @@ ves_icall_System_Array_CreateInstanceImpl64 (MonoReflectionType *type, MonoArray uintptr_t *sizes, i; gboolean bounded = FALSE; - MONO_ARCH_SAVE_REGS; - MONO_CHECK_ARG_NULL (type); MONO_CHECK_ARG_NULL (lengths); @@ -620,8 +607,6 @@ ves_icall_System_Array_CreateInstanceImpl64 (MonoReflectionType *type, MonoArray ICALL_EXPORT gint32 ves_icall_System_Array_GetRank (MonoObject *this) { - MONO_ARCH_SAVE_REGS; - return this->vtable->klass->rank; } @@ -631,8 +616,6 @@ ves_icall_System_Array_GetLength (MonoArray *this, gint32 dimension) gint32 rank = ((MonoObject *)this)->vtable->klass->rank; uintptr_t length; - MONO_ARCH_SAVE_REGS; - if ((dimension < 0) || (dimension >= rank)) mono_raise_exception (mono_get_exception_index_out_of_range ()); @@ -653,8 +636,6 @@ ves_icall_System_Array_GetLongLength (MonoArray *this, gint32 dimension) { gint32 rank = ((MonoObject *)this)->vtable->klass->rank; - MONO_ARCH_SAVE_REGS; - if ((dimension < 0) || (dimension >= rank)) mono_raise_exception (mono_get_exception_index_out_of_range ()); @@ -669,8 +650,6 @@ ves_icall_System_Array_GetLowerBound (MonoArray *this, gint32 dimension) { gint32 rank = ((MonoObject *)this)->vtable->klass->rank; - MONO_ARCH_SAVE_REGS; - if ((dimension < 0) || (dimension >= rank)) mono_raise_exception (mono_get_exception_index_out_of_range ()); @@ -759,8 +738,6 @@ ves_icall_System_Array_GetGenericValueImpl (MonoObject *this, guint32 pos, gpoin gint32 esize; gpointer *ea; - MONO_ARCH_SAVE_REGS; - ao = (MonoArray *)this; ac = (MonoClass *)ao->obj.vtable->klass; @@ -778,8 +755,6 @@ ves_icall_System_Array_SetGenericValueImpl (MonoObject *this, guint32 pos, gpoin gint32 esize; gpointer *ea; - MONO_ARCH_SAVE_REGS; - ao = (MonoArray *)this; ac = (MonoClass *)ao->obj.vtable->klass; ec = ac->element_class; @@ -871,16 +846,12 @@ ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_InitializeArray (MonoAr ICALL_EXPORT gint ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetOffsetToStringData (void) { - MONO_ARCH_SAVE_REGS; - return offsetof (MonoString, chars); } ICALL_EXPORT MonoObject * ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetObjectValue (MonoObject *obj) { - MONO_ARCH_SAVE_REGS; - if ((obj == NULL) || (! (obj->vtable->klass->valuetype))) return obj; else @@ -949,8 +920,6 @@ ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_SufficientExecutionStac ICALL_EXPORT MonoObject * ves_icall_System_Object_MemberwiseClone (MonoObject *this) { - MONO_ARCH_SAVE_REGS; - return mono_object_clone (this); } @@ -965,8 +934,6 @@ ves_icall_System_ValueType_InternalGetHashCode (MonoObject *this, MonoArray **fi MonoClassField* field; gpointer iter; - MONO_ARCH_SAVE_REGS; - klass = mono_object_class (this); if (mono_class_num_fields (klass) == 0) @@ -1024,8 +991,6 @@ ves_icall_System_ValueType_Equals (MonoObject *this, MonoObject *that, MonoArray gpointer iter; int count = 0; - MONO_ARCH_SAVE_REGS; - MONO_CHECK_ARG_NULL (that); if (this->vtable != that->vtable) @@ -1129,8 +1094,6 @@ ves_icall_System_ValueType_Equals (MonoObject *this, MonoObject *that, MonoArray ICALL_EXPORT MonoReflectionType * ves_icall_System_Object_GetType (MonoObject *obj) { - MONO_ARCH_SAVE_REGS; - #ifndef DISABLE_REMOTING if (obj->vtable->klass == mono_defaults.transparent_proxy_class) return mono_type_get_object (mono_object_domain (obj), &((MonoTransparentProxy*)obj)->remote_class->proxy_class->byval_arg); @@ -1142,8 +1105,6 @@ ves_icall_System_Object_GetType (MonoObject *obj) ICALL_EXPORT void mono_type_type_from_obj (MonoReflectionType *mtype, MonoObject *obj) { - MONO_ARCH_SAVE_REGS; - mtype->type = &obj->vtable->klass->byval_arg; g_assert (mtype->type->type); } @@ -1151,8 +1112,6 @@ mono_type_type_from_obj (MonoReflectionType *mtype, MonoObject *obj) ICALL_EXPORT gint32 ves_icall_ModuleBuilder_getToken (MonoReflectionModuleBuilder *mb, MonoObject *obj, gboolean create_open_instance) { - MONO_ARCH_SAVE_REGS; - MONO_CHECK_ARG_NULL (obj); return mono_image_create_token (mb->dynamic_image, obj, create_open_instance, TRUE); @@ -1163,8 +1122,6 @@ ves_icall_ModuleBuilder_getMethodToken (MonoReflectionModuleBuilder *mb, MonoReflectionMethod *method, MonoArray *opt_param_types) { - MONO_ARCH_SAVE_REGS; - MONO_CHECK_ARG_NULL (method); return mono_image_create_method_token ( @@ -1174,24 +1131,18 @@ ves_icall_ModuleBuilder_getMethodToken (MonoReflectionModuleBuilder *mb, ICALL_EXPORT void ves_icall_ModuleBuilder_WriteToFile (MonoReflectionModuleBuilder *mb, HANDLE file) { - MONO_ARCH_SAVE_REGS; - mono_image_create_pefile (mb, file); } ICALL_EXPORT void ves_icall_ModuleBuilder_build_metadata (MonoReflectionModuleBuilder *mb) { - MONO_ARCH_SAVE_REGS; - mono_image_build_metadata (mb); } ICALL_EXPORT void ves_icall_ModuleBuilder_RegisterToken (MonoReflectionModuleBuilder *mb, MonoObject *obj, guint32 token) { - MONO_ARCH_SAVE_REGS; - mono_image_register_token (mb->dynamic_image, token, obj); } @@ -1270,8 +1221,6 @@ type_from_name (const char *str, MonoBoolean ignoreCase) char *temp_str = g_strdup (str); gboolean type_resolve = FALSE; - MONO_ARCH_SAVE_REGS; - /* mono_reflection_parse_type() mangles the string */ if (!mono_reflection_parse_type (temp_str, &info)) { mono_reflection_free_type_info (&info); @@ -1375,16 +1324,12 @@ ves_icall_type_from_handle (MonoType *handle) { MonoDomain *domain = mono_domain_get (); - MONO_ARCH_SAVE_REGS; - return mono_type_get_object (domain, handle); } ICALL_EXPORT MonoBoolean ves_icall_System_Type_EqualsInternal (MonoReflectionType *type, MonoReflectionType *c) { - MONO_ARCH_SAVE_REGS; - if (c && type->type && c->type) return mono_metadata_type_equal (type->type, c->type); else @@ -1418,8 +1363,6 @@ ves_icall_type_GetTypeCodeInternal (MonoReflectionType *type) { int t = type->type->type; - MONO_ARCH_SAVE_REGS; - if (type->type->byref) return TYPECODE_OBJECT; @@ -1504,8 +1447,6 @@ ves_icall_type_is_subtype_of (MonoReflectionType *type, MonoReflectionType *c, M MonoClass *klass; MonoClass *klassc; - MONO_ARCH_SAVE_REGS; - g_assert (type != NULL); domain = ((MonoObject *)type)->vtable->domain; @@ -1557,8 +1498,6 @@ ves_icall_type_is_assignable_from (MonoReflectionType *type, MonoReflectionType MonoClass *klass; MonoClass *klassc; - MONO_ARCH_SAVE_REGS; - g_assert (type != NULL); domain = ((MonoObject *)type)->vtable->domain; @@ -1691,7 +1630,6 @@ ves_icall_get_method_info (MonoMethod *method, MonoMethodInfo *info) MonoError error; MonoDomain *domain = mono_domain_get (); MonoMethodSignature* sig; - MONO_ARCH_SAVE_REGS; sig = mono_method_signature_checked (method, &error); if (!mono_error_ok (&error)) @@ -1758,7 +1696,6 @@ ICALL_EXPORT MonoReflectionType* ves_icall_MonoField_GetParentType (MonoReflectionField *field, MonoBoolean declaring) { MonoClass *parent; - MONO_ARCH_SAVE_REGS; parent = declaring? field->field->parent: field->klass; @@ -1790,8 +1727,6 @@ ves_icall_MonoField_SetValueInternal (MonoReflectionField *field, MonoObject *ob MonoType *type; gchar *v; - MONO_ARCH_SAVE_REGS; - if (field->klass->image->assembly->ref_only) mono_raise_exception (mono_get_exception_invalid_operation ( "It is illegal to set the value on a field on a type loaded using the ReflectionOnly methods.")); @@ -1886,8 +1821,6 @@ ves_icall_MonoField_GetRawConstantValue (MonoReflectionField *this) MonoType *t; MonoError error; - MONO_ARCH_SAVE_REGS; - mono_class_init (field->parent); t = mono_field_get_type_checked (field, &error); @@ -1898,14 +1831,23 @@ ves_icall_MonoField_GetRawConstantValue (MonoReflectionField *this) mono_raise_exception (mono_get_exception_invalid_operation (NULL)); if (image_is_dynamic (field->parent->image)) { - /* FIXME: */ - g_assert_not_reached (); + MonoClass *klass = field->parent; + int fidx = field - klass->fields; + + g_assert (fidx >= 0 && fidx < klass->field.count); + g_assert (klass->ext); + g_assert (klass->ext->field_def_values); + def_type = klass->ext->field_def_values [fidx].def_type; + def_value = klass->ext->field_def_values [fidx].data; + if (def_type == MONO_TYPE_END) + mono_raise_exception (mono_get_exception_invalid_operation (NULL)); + } else { + def_value = mono_class_get_field_default_value (field, &def_type); + /* FIXME, maybe we should try to raise TLE if field->parent is broken */ + if (!def_value) + mono_raise_exception (mono_get_exception_invalid_operation (NULL)); } - def_value = mono_class_get_field_default_value (field, &def_type); - if (!def_value) /*FIXME, maybe we should try to raise TLE if field->parent is broken */ - mono_raise_exception (mono_get_exception_invalid_operation (NULL)); - /*FIXME unify this with reflection.c:mono_get_object_from_blob*/ switch (def_type) { case MONO_TYPE_U1: @@ -1979,8 +1921,6 @@ ves_icall_get_property_info (MonoReflectionProperty *property, MonoPropertyInfo { MonoDomain *domain = mono_object_domain (property); - MONO_ARCH_SAVE_REGS; - if ((req_info & PInfo_ReflectedType) != 0) MONO_STRUCT_SETREF (info, parent, mono_type_get_object (domain, &property->klass->byval_arg)); if ((req_info & PInfo_DeclaringType) != 0) @@ -2010,8 +1950,6 @@ ves_icall_get_event_info (MonoReflectionMonoEvent *event, MonoEventInfo *info) { MonoDomain *domain = mono_object_domain (event); - MONO_ARCH_SAVE_REGS; - MONO_STRUCT_SETREF (info, reflected_type, mono_type_get_object (domain, &event->klass->byval_arg)); MONO_STRUCT_SETREF (info, declaring_type, mono_type_get_object (domain, &event->event->parent->byval_arg)); @@ -2146,7 +2084,6 @@ ves_icall_Type_GetInterfaceMapData (MonoReflectionType *type, MonoReflectionType int i = 0, len, ioffset; MonoDomain *domain; - MONO_ARCH_SAVE_REGS; mono_class_init_or_throw (class); mono_class_init_or_throw (iclass); @@ -2191,8 +2128,6 @@ ves_icall_MonoType_GetElementType (MonoReflectionType *type) { MonoClass *class; - MONO_ARCH_SAVE_REGS; - if (!type->type->byref && type->type->type == MONO_TYPE_SZARRAY) return mono_type_get_object (mono_object_domain (type), &type->type->data.klass->byval_arg); @@ -2221,24 +2156,18 @@ ves_icall_get_type_parent (MonoReflectionType *type) ICALL_EXPORT MonoBoolean ves_icall_type_ispointer (MonoReflectionType *type) { - MONO_ARCH_SAVE_REGS; - return type->type->type == MONO_TYPE_PTR; } ICALL_EXPORT MonoBoolean ves_icall_type_isprimitive (MonoReflectionType *type) { - MONO_ARCH_SAVE_REGS; - return (!type->type->byref && (((type->type->type >= MONO_TYPE_BOOLEAN) && (type->type->type <= MONO_TYPE_R8)) || (type->type->type == MONO_TYPE_I) || (type->type->type == MONO_TYPE_U))); } ICALL_EXPORT MonoBoolean ves_icall_type_isbyref (MonoReflectionType *type) { - MONO_ARCH_SAVE_REGS; - return type->type->byref; } @@ -2272,8 +2201,6 @@ ves_icall_MonoType_get_DeclaringType (MonoReflectionType *type) MonoDomain *domain = mono_domain_get (); MonoClass *class; - MONO_ARCH_SAVE_REGS; - if (type->type->byref) return NULL; if (type->type->type == MONO_TYPE_VAR) { @@ -2343,7 +2270,6 @@ ves_icall_MonoType_GetGenericArguments (MonoReflectionType *type) MonoDomain *domain = mono_object_domain (type); MonoVTable *array_vtable = mono_class_vtable_full (domain, mono_array_class_get_cached (mono_defaults.systemtype_class, 1), TRUE); int i; - MONO_ARCH_SAVE_REGS; klass = mono_class_from_mono_type (type->type); @@ -2369,7 +2295,6 @@ ICALL_EXPORT gboolean ves_icall_Type_get_IsGenericTypeDefinition (MonoReflectionType *type) { MonoClass *klass; - MONO_ARCH_SAVE_REGS; if (!IS_MONOTYPE (type)) return FALSE; @@ -2385,7 +2310,6 @@ ICALL_EXPORT MonoReflectionType* ves_icall_Type_GetGenericTypeDefinition_impl (MonoReflectionType *type) { MonoClass *klass; - MONO_ARCH_SAVE_REGS; if (type->type->byref) return NULL; @@ -2445,7 +2369,6 @@ ICALL_EXPORT gboolean ves_icall_Type_get_IsGenericInstance (MonoReflectionType *type) { MonoClass *klass; - MONO_ARCH_SAVE_REGS; if (type->type->byref) return FALSE; @@ -2459,7 +2382,6 @@ ICALL_EXPORT gboolean ves_icall_Type_get_IsGenericType (MonoReflectionType *type) { MonoClass *klass; - MONO_ARCH_SAVE_REGS; if (!IS_MONOTYPE (type)) return FALSE; @@ -2474,8 +2396,6 @@ ves_icall_Type_get_IsGenericType (MonoReflectionType *type) ICALL_EXPORT gint32 ves_icall_Type_GetGenericParameterPosition (MonoReflectionType *type) { - MONO_ARCH_SAVE_REGS; - if (!IS_MONOTYPE (type)) return -1; @@ -2487,8 +2407,6 @@ ves_icall_Type_GetGenericParameterPosition (MonoReflectionType *type) ICALL_EXPORT GenericParameterAttributes ves_icall_Type_GetGenericParameterAttributes (MonoReflectionType *type) { - MONO_ARCH_SAVE_REGS; - g_assert (IS_MONOTYPE (type)); g_assert (is_generic_parameter (type->type)); return mono_generic_param_info (type->type->data.generic_param)->flags; @@ -2503,8 +2421,6 @@ ves_icall_Type_GetGenericParameterConstraints (MonoReflectionType *type) MonoArray *res; int i, count; - MONO_ARCH_SAVE_REGS; - g_assert (IS_MONOTYPE (type)); domain = mono_object_domain (type); @@ -2523,14 +2439,12 @@ ves_icall_Type_GetGenericParameterConstraints (MonoReflectionType *type) ICALL_EXPORT MonoBoolean ves_icall_MonoType_get_IsGenericParameter (MonoReflectionType *type) { - MONO_ARCH_SAVE_REGS; return is_generic_parameter (type->type); } ICALL_EXPORT MonoBoolean ves_icall_TypeBuilder_get_IsGenericParameter (MonoReflectionTypeBuilder *tb) { - MONO_ARCH_SAVE_REGS; return is_generic_parameter (tb->type.type); } @@ -2550,8 +2464,6 @@ ves_icall_MonoType_GetCorrespondingInflatedMethod (MonoReflectionType *type, MonoMethod *method; gpointer iter; - MONO_ARCH_SAVE_REGS; - domain = ((MonoObject *)type)->vtable->domain; klass = mono_class_from_mono_type (type->type); @@ -2574,8 +2486,6 @@ ves_icall_MonoType_get_DeclaringMethod (MonoReflectionType *ref_type) MonoMethod *method; MonoType *type = ref_type->type; - MONO_ARCH_SAVE_REGS; - if (type->byref || (type->type != MONO_TYPE_MVAR && type->type != MONO_TYPE_VAR)) mono_raise_exception (mono_get_exception_invalid_operation ("DeclaringMethod can only be used on generic arguments")); if (type->type == MONO_TYPE_VAR) @@ -2662,8 +2572,6 @@ ves_icall_MonoMethod_GetGenericMethodDefinition (MonoReflectionMethod *method) MonoMethodInflated *imethod; MonoMethod *result; - MONO_ARCH_SAVE_REGS; - if (method->method->is_generic) return method; @@ -2696,8 +2604,11 @@ ves_icall_MonoMethod_GetGenericMethodDefinition (MonoReflectionMethod *method) if (imethod->context.class_inst) { MonoClass *klass = ((MonoMethod *) imethod)->klass; /*Generic methods gets the context of the GTD.*/ - if (mono_class_get_context (klass)) - result = mono_class_inflate_generic_method_full (result, klass, mono_class_get_context (klass)); + if (mono_class_get_context (klass)) { + MonoError error; + result = mono_class_inflate_generic_method_full_checked (result, klass, mono_class_get_context (klass), &error); + mono_error_raise_exception (&error); + } } return mono_method_get_object (mono_object_domain (method), result, NULL); @@ -2706,16 +2617,12 @@ ves_icall_MonoMethod_GetGenericMethodDefinition (MonoReflectionMethod *method) ICALL_EXPORT gboolean ves_icall_MonoMethod_get_IsGenericMethod (MonoReflectionMethod *method) { - MONO_ARCH_SAVE_REGS; - return mono_method_signature (method->method)->generic_param_count != 0; } ICALL_EXPORT gboolean ves_icall_MonoMethod_get_IsGenericMethodDefinition (MonoReflectionMethod *method) { - MONO_ARCH_SAVE_REGS; - return method->method->is_generic; } @@ -2725,7 +2632,6 @@ ves_icall_MonoMethod_GetGenericArguments (MonoReflectionMethod *method) MonoArray *res; MonoDomain *domain; int count, i; - MONO_ARCH_SAVE_REGS; domain = mono_object_domain (method); @@ -2772,8 +2678,6 @@ ves_icall_InternalInvoke (MonoReflectionMethod *method, MonoObject *this, MonoAr int pcount; void *obj = this; - MONO_ARCH_SAVE_REGS; - *exc = NULL; if (mono_security_core_clr_enabled ()) @@ -2843,6 +2747,18 @@ ves_icall_InternalInvoke (MonoReflectionMethod *method, MonoObject *this, MonoAr for (i = 0; i < pcount; ++i) lengths [i] = *(int32_t*) ((char*)mono_array_get (params, gpointer, i) + sizeof (MonoObject)); + if (m->klass->rank == 1 && sig->param_count == 2 && m->klass->element_class->rank) { + /* This is a ctor for jagged arrays. MS creates an array of arrays. */ + MonoArray *arr = mono_array_new_full (mono_object_domain (params), m->klass, lengths, NULL); + + for (i = 0; i < mono_array_length (arr); ++i) { + MonoArray *subarray = mono_array_new_full (mono_object_domain (params), m->klass->element_class, &lengths [1], NULL); + + mono_array_setref_fast (arr, i, subarray); + } + return (MonoObject*)arr; + } + if (m->klass->rank == pcount) { /* Only lengths provided. */ lower_bounds = NULL; @@ -2869,10 +2785,7 @@ ves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this, MonoA MonoObject *result; int i, j, outarg_count = 0; - MONO_ARCH_SAVE_REGS; - if (m->klass == mono_defaults.object_class) { - if (!strcmp (m->name, "FieldGetter")) { MonoClass *k = this->vtable->klass; MonoString *name; @@ -2992,10 +2905,12 @@ static guint64 read_enum_value (char *mem, int type) { switch (type) { + case MONO_TYPE_BOOLEAN: case MONO_TYPE_U1: return *(guint8*)mem; case MONO_TYPE_I1: return *(gint8*)mem; + case MONO_TYPE_CHAR: case MONO_TYPE_U2: return *(guint16*)mem; case MONO_TYPE_I2: @@ -3057,8 +2972,6 @@ ves_icall_System_Enum_ToObject (MonoReflectionType *enumType, MonoObject *value) MonoType *etype; guint64 val; - MONO_ARCH_SAVE_REGS; - MONO_CHECK_ARG_NULL (enumType); MONO_CHECK_ARG_NULL (value); @@ -3071,7 +2984,7 @@ ves_icall_System_Enum_ToObject (MonoReflectionType *enumType, MonoObject *value) if (!enumc->enumtype) mono_raise_exception (mono_get_exception_argument ("enumType", "Type provided must be an Enum.")); - if (!((objc->enumtype) || (objc->byval_arg.type >= MONO_TYPE_I1 && objc->byval_arg.type <= MONO_TYPE_U8))) + if (!((objc->enumtype) || (objc->byval_arg.type >= MONO_TYPE_BOOLEAN && objc->byval_arg.type <= MONO_TYPE_U8))) mono_raise_exception (mono_get_exception_argument ("value", "The value passed in must be an enum base or an underlying type for an enum, such as an Int32.")); etype = mono_class_enum_basetype (enumc); @@ -3086,6 +2999,18 @@ ves_icall_System_Enum_ToObject (MonoReflectionType *enumType, MonoObject *value) return res; } +ICALL_EXPORT MonoBoolean +ves_icall_System_Enum_InternalHasFlag (MonoObject *a, MonoObject *b) +{ + int size = mono_class_value_size (a->vtable->klass, NULL); + guint64 a_val = 0, b_val = 0; + + memcpy (&a_val, mono_object_unbox (a), size); + memcpy (&b_val, mono_object_unbox (b), size); + + return (a_val & b_val) == b_val; +} + ICALL_EXPORT MonoObject * ves_icall_System_Enum_get_value (MonoObject *this) { @@ -3095,8 +3020,6 @@ ves_icall_System_Enum_get_value (MonoObject *this) gpointer src; int size; - MONO_ARCH_SAVE_REGS; - if (!this) return NULL; @@ -3119,8 +3042,6 @@ ves_icall_System_Enum_get_underlying_type (MonoReflectionType *type) MonoType *etype; MonoClass *klass; - MONO_ARCH_SAVE_REGS; - klass = mono_class_from_mono_type (type->type); mono_class_init_or_throw (klass); @@ -3215,8 +3136,6 @@ ves_icall_get_enum_info (MonoReflectionType *type, MonoEnumInfo *info) gpointer iter; MonoClassField *field; - MONO_ARCH_SAVE_REGS; - mono_class_init_or_throw (enumc); MONO_STRUCT_SETREF (info, utype, mono_type_get_object (domain, mono_class_enum_basetype (enumc))); @@ -3367,8 +3286,6 @@ ves_icall_Type_GetFields_internal (MonoReflectionType *type, guint32 bflags, Mon MonoClassField *field; MonoPtrArray tmp_array; - MONO_ARCH_SAVE_REGS; - domain = ((MonoObject *)type)->vtable->domain; if (type->type->byref) return mono_array_new (domain, mono_defaults.field_info_class, 0); @@ -3473,6 +3390,7 @@ mono_class_get_methods_by_name (MonoClass *klass, const char *name, guint32 bfla return array; } + mono_class_setup_methods (klass); mono_class_setup_vtable (klass); if (klass->exception_type != MONO_EXCEPTION_NONE || mono_loader_get_last_error ()) goto loader_error; @@ -3488,6 +3406,7 @@ mono_class_get_methods_by_name (MonoClass *klass, const char *name, guint32 bfla memset (method_slots, 0, sizeof (method_slots_default)); } handle_parent: + mono_class_setup_methods (klass); mono_class_setup_vtable (klass); if (klass->exception_type != MONO_EXCEPTION_NONE || mono_loader_get_last_error ()) goto loader_error; @@ -3614,8 +3533,6 @@ ves_icall_Type_GetConstructors_internal (MonoReflectionType *type, guint32 bflag gpointer iter = NULL; MonoPtrArray tmp_array; - MONO_ARCH_SAVE_REGS; - mono_ptr_array_init (tmp_array, 4); /*FIXME, guestimating*/ domain = ((MonoObject *)type)->vtable->domain; @@ -3628,6 +3545,11 @@ ves_icall_Type_GetConstructors_internal (MonoReflectionType *type, guint32 bflag System_Reflection_ConstructorInfo = mono_class_from_name ( mono_defaults.corlib, "System.Reflection", "ConstructorInfo"); + mono_class_setup_methods (klass); + if (klass->exception_type != MONO_EXCEPTION_NONE) + mono_raise_exception (mono_class_get_exception_for_failure (klass)); + + iter = NULL; while ((method = mono_class_get_methods (klass, &iter))) { match = 0; @@ -3718,8 +3640,6 @@ ves_icall_Type_GetPropertiesByName (MonoReflectionType *type, MonoString *name, GHashTable *properties = NULL; MonoPtrArray tmp_array; - MONO_ARCH_SAVE_REGS; - mono_ptr_array_init (tmp_array, 8); /*This the average for ASP.NET types*/ if (!System_Reflection_PropertyInfo) @@ -3738,6 +3658,7 @@ ves_icall_Type_GetPropertiesByName (MonoReflectionType *type, MonoString *name, properties = g_hash_table_new (property_hash, (GEqualFunc)property_equal); handle_parent: + mono_class_setup_methods (klass); mono_class_setup_vtable (klass); if (klass->exception_type != MONO_EXCEPTION_NONE || mono_loader_get_last_error ()) goto loader_error; @@ -3832,8 +3753,6 @@ ves_icall_MonoType_GetEvent (MonoReflectionType *type, MonoString *name, guint32 gchar *event_name; int (*compare_func) (const char *s1, const char *s2); - MONO_ARCH_SAVE_REGS; - event_name = mono_string_to_utf8 (name); if (type->type->byref) return NULL; @@ -3922,8 +3841,6 @@ ves_icall_Type_GetEvents_internal (MonoReflectionType *type, guint32 bflags, Mon GHashTable *events = NULL; MonoPtrArray tmp_array; - MONO_ARCH_SAVE_REGS; - mono_ptr_array_init (tmp_array, 4); if (!System_Reflection_EventInfo) @@ -3937,6 +3854,7 @@ ves_icall_Type_GetEvents_internal (MonoReflectionType *type, guint32 bflags, Mon events = g_hash_table_new (event_hash, (GEqualFunc)event_equal); handle_parent: + mono_class_setup_methods (klass); mono_class_setup_vtable (klass); if (klass->exception_type != MONO_EXCEPTION_NONE || mono_loader_get_last_error ()) goto loader_error; @@ -4022,8 +3940,6 @@ ves_icall_Type_GetNestedType (MonoReflectionType *type, MonoString *name, guint3 char *str; gpointer iter; - MONO_ARCH_SAVE_REGS; - if (name == NULL) mono_raise_exception (mono_get_exception_argument_null ("name")); @@ -4085,8 +4001,6 @@ ves_icall_Type_GetNestedTypes (MonoReflectionType *type, guint32 bflags) gpointer iter; MonoPtrArray tmp_array; - MONO_ARCH_SAVE_REGS; - domain = ((MonoObject *)type)->vtable->domain; if (type->type->byref) return mono_array_new (domain, mono_defaults.monotype_class, 0); @@ -4139,8 +4053,6 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as MonoTypeNameParse info; gboolean type_resolve; - MONO_ARCH_SAVE_REGS; - /* On MS.NET, this does not fire a TypeResolve event */ type_resolve = TRUE; str = mono_string_to_utf8 (name); @@ -4284,8 +4196,6 @@ ves_icall_System_Reflection_Assembly_get_code_base (MonoReflectionAssembly *asse gchar *absolute; gchar *dirname; - MONO_ARCH_SAVE_REGS; - if (g_path_is_absolute (mass->image->name)) { absolute = g_strdup (mass->image->name); dirname = g_path_get_dirname (absolute); @@ -4331,8 +4241,6 @@ ves_icall_System_Reflection_Assembly_get_global_assembly_cache (MonoReflectionAs { MonoAssembly *mass = assembly->assembly; - MONO_ARCH_SAVE_REGS; - return mass->in_gac; } @@ -4343,8 +4251,6 @@ ves_icall_System_Reflection_Assembly_load_with_partial_name (MonoString *mname, MonoAssembly *res; MonoImageOpenStatus status; - MONO_ARCH_SAVE_REGS; - name = mono_string_to_utf8 (mname); res = mono_assembly_load_with_partial_name (name, &status); @@ -4361,8 +4267,6 @@ ves_icall_System_Reflection_Assembly_get_location (MonoReflectionAssembly *assem MonoDomain *domain = mono_object_domain (assembly); MonoString *res; - MONO_ARCH_SAVE_REGS; - res = mono_string_new (domain, mono_image_get_filename (assembly->assembly->image)); return res; @@ -4371,8 +4275,6 @@ ves_icall_System_Reflection_Assembly_get_location (MonoReflectionAssembly *assem ICALL_EXPORT MonoBoolean ves_icall_System_Reflection_Assembly_get_ReflectionOnly (MonoReflectionAssembly *assembly) { - MONO_ARCH_SAVE_REGS; - return assembly->assembly->ref_only; } @@ -4381,21 +4283,22 @@ ves_icall_System_Reflection_Assembly_InternalImageRuntimeVersion (MonoReflection { MonoDomain *domain = mono_object_domain (assembly); - MONO_ARCH_SAVE_REGS; - return mono_string_new (domain, assembly->assembly->image->version); } ICALL_EXPORT MonoReflectionMethod* ves_icall_System_Reflection_Assembly_get_EntryPoint (MonoReflectionAssembly *assembly) { + MonoError error; + MonoMethod *method; guint32 token = mono_image_get_entry_point (assembly->assembly->image); - MONO_ARCH_SAVE_REGS; - if (!token) return NULL; - return mono_method_get_object (mono_object_domain (assembly), mono_get_method (assembly->assembly->image, token, NULL), NULL); + method = mono_get_method_checked (assembly->assembly->image, token, NULL, NULL, &error); + mono_error_raise_exception (&error); + + return mono_method_get_object (mono_object_domain (assembly), method, NULL); } ICALL_EXPORT MonoReflectionModule* @@ -4412,8 +4315,6 @@ ves_icall_System_Reflection_Assembly_GetManifestResourceNames (MonoReflectionAss int i; const char *val; - MONO_ARCH_SAVE_REGS; - for (i = 0; i < table->rows; ++i) { val = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_MANIFEST_NAME)); mono_array_setref (result, i, mono_string_new (mono_object_domain (assembly), val)); @@ -4462,8 +4363,6 @@ ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAsse MonoImage *image = assembly->assembly->image; MonoTableInfo *t; - MONO_ARCH_SAVE_REGS; - if (!System_Reflection_AssemblyName) System_Reflection_AssemblyName = mono_class_from_name ( mono_defaults.corlib, "System.Reflection", "AssemblyName"); @@ -4562,8 +4461,6 @@ ves_icall_System_Reflection_Assembly_GetManifestResourceInternal (MonoReflection const char *val; MonoImage *module; - MONO_ARCH_SAVE_REGS; - for (i = 0; i < table->rows; ++i) { mono_metadata_decode_row (table, i, cols, MONO_MANIFEST_SIZE); val = mono_metadata_string_heap (assembly->assembly->image, cols [MONO_MANIFEST_NAME]); @@ -4605,8 +4502,6 @@ ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (MonoReflec const char *val; char *n; - MONO_ARCH_SAVE_REGS; - n = mono_string_to_utf8 (name); for (i = 0; i < table->rows; ++i) { mono_metadata_decode_row (table, i, cols, MONO_MANIFEST_SIZE); @@ -4669,8 +4564,6 @@ ves_icall_System_Reflection_Assembly_GetFilesInternal (MonoReflectionAssembly *a const char *val; char *n; - MONO_ARCH_SAVE_REGS; - /* check hash if needed */ if (name) { n = mono_string_to_utf8 (name); @@ -4782,6 +4675,8 @@ mono_method_get_equivalent_method (MonoMethod *method, MonoClass *klass) { int offset = -1, i; if (method->is_inflated && ((MonoMethodInflated*)method)->context.method_inst) { + MonoError error; + MonoMethod *result; MonoMethodInflated *inflated = (MonoMethodInflated*)method; //method is inflated, we should inflate it on the other class MonoGenericContext ctx; @@ -4791,7 +4686,9 @@ mono_method_get_equivalent_method (MonoMethod *method, MonoClass *klass) ctx.class_inst = klass->generic_class->context.class_inst; else if (klass->generic_container) ctx.class_inst = klass->generic_container->context.class_inst; - return mono_class_inflate_generic_method_full (inflated->declaring, klass, &ctx); + result = mono_class_inflate_generic_method_full_checked (inflated->declaring, klass, &ctx, &error); + g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */ + return result; } mono_class_setup_methods (method->klass); @@ -4845,8 +4742,6 @@ ves_icall_System_Reflection_Assembly_GetExecutingAssembly (void) { MonoMethod *dest = NULL; - MONO_ARCH_SAVE_REGS; - mono_stack_walk_no_il (get_executing, &dest); g_assert (dest); return mono_assembly_get_object (mono_domain_get (), dest->klass->image->assembly); @@ -4858,8 +4753,6 @@ ves_icall_System_Reflection_Assembly_GetEntryAssembly (void) { MonoDomain* domain = mono_domain_get (); - MONO_ARCH_SAVE_REGS; - if (!domain->entry_assembly) return NULL; @@ -4872,8 +4765,6 @@ ves_icall_System_Reflection_Assembly_GetCallingAssembly (void) MonoMethod *m; MonoMethod *dest; - MONO_ARCH_SAVE_REGS; - dest = NULL; mono_stack_walk_no_il (get_executing, &dest); m = dest; @@ -4932,8 +4823,6 @@ fill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *a gchar *codebase; MonoBoolean assembly_ref = 0; - MONO_ARCH_SAVE_REGS; - MONO_OBJECT_SETREF (aname, name, mono_string_new (domain, name->name)); aname->major = name->major; aname->minor = name->minor; @@ -5042,8 +4931,6 @@ ves_icall_System_Reflection_Assembly_FillName (MonoReflectionAssembly *assembly, gchar *absolute; MonoAssembly *mass = assembly->assembly; - MONO_ARCH_SAVE_REGS; - if (g_path_is_absolute (mass->image->name)) { fill_reflection_assembly_name (mono_object_domain (assembly), aname, &mass->aname, mass->image->name, TRUE, @@ -5067,9 +4954,7 @@ ves_icall_System_Reflection_Assembly_InternalGetAssemblyName (MonoString *fname, gboolean res; MonoImage *image; MonoAssemblyName name; - char *dirname - - MONO_ARCH_SAVE_REGS; + char *dirname; filename = mono_string_to_utf8 (fname); @@ -5189,8 +5074,6 @@ ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly, GList *list = NULL; int i, len, ex_count; - MONO_ARCH_SAVE_REGS; - domain = mono_object_domain (assembly); g_assert (!assembly_is_dynamic (assembly->assembly)); @@ -5320,8 +5203,6 @@ ves_icall_System_Reflection_Module_GetGlobalType (MonoReflectionModule *module) MonoDomain *domain = mono_object_domain (module); MonoClass *klass; - MONO_ARCH_SAVE_REGS; - g_assert (module->image); if (image_is_dynamic (module->image) && ((MonoDynamicImage*)(module->image))->initial_image) @@ -5345,8 +5226,6 @@ ves_icall_System_Reflection_Module_GetGuidInternal (MonoReflectionModule *module { MonoDomain *domain = mono_object_domain (module); - MONO_ARCH_SAVE_REGS; - g_assert (module->image); return mono_string_new (domain, module->image->guid); } @@ -5388,8 +5267,6 @@ ves_icall_System_Reflection_Module_InternalGetTypes (MonoReflectionModule *modul MonoArray *exceptions; int i; - MONO_ARCH_SAVE_REGS; - if (!module->image) return mono_array_new (mono_object_domain (module), mono_defaults.monotype_class, 0); else { @@ -5485,19 +5362,20 @@ ves_icall_System_Reflection_Module_ResolveTypeToken (MonoImage *image, guint32 t } ICALL_EXPORT MonoMethod* -ves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *error) +ves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *resolve_error) { + MonoError error; int table = mono_metadata_token_table (token); int index = mono_metadata_token_index (token); MonoGenericContext context; MonoMethod *method; - *error = ResolveTokenError_Other; + *resolve_error = ResolveTokenError_Other; /* Validate token */ if ((table != MONO_TABLE_METHOD) && (table != MONO_TABLE_METHODSPEC) && (table != MONO_TABLE_MEMBERREF)) { - *error = ResolveTokenError_BadTable; + *resolve_error = ResolveTokenError_BadTable; return NULL; } @@ -5506,7 +5384,7 @@ ves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32 return mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL); if ((table == MONO_TABLE_MEMBERREF) && !(mono_memberref_is_method (image, token))) { - *error = ResolveTokenError_BadTable; + *resolve_error = ResolveTokenError_BadTable; return NULL; } @@ -5515,19 +5393,17 @@ ves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32 } if ((index <= 0) || (index > image->tables [table].rows)) { - *error = ResolveTokenError_OutOfRange; + *resolve_error = ResolveTokenError_OutOfRange; return NULL; } if ((table == MONO_TABLE_MEMBERREF) && (!mono_memberref_is_method (image, token))) { - *error = ResolveTokenError_BadTable; + *resolve_error = ResolveTokenError_BadTable; return NULL; } init_generic_context_from_args (&context, type_args, method_args); - method = mono_get_method_full (image, token, NULL, &context); - - if (mono_loader_get_last_error ()) - mono_raise_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ())); + method = mono_get_method_checked (image, token, NULL, &context, &error); + mono_error_raise_exception (&error); return method; } @@ -5702,8 +5578,6 @@ ves_icall_ModuleBuilder_create_modified_type (MonoReflectionTypeBuilder *tb, Mon char *str = mono_string_to_utf8 (smodifiers); char *p; - MONO_ARCH_SAVE_REGS; - klass = mono_class_from_mono_type (tb->type.type); p = str; /* logic taken from mono_reflection_parse_type(): keep in sync */ @@ -5760,8 +5634,6 @@ ves_icall_Type_IsArrayImpl (MonoReflectionType *t) MonoType *type; MonoBoolean res; - MONO_ARCH_SAVE_REGS; - type = t->type; res = !type->byref && (type->type == MONO_TYPE_ARRAY || type->type == MONO_TYPE_SZARRAY); @@ -5787,8 +5659,6 @@ ves_icall_Type_make_array_type (MonoReflectionType *type, int rank) { MonoClass *klass, *aklass; - MONO_ARCH_SAVE_REGS; - klass = mono_class_from_mono_type (type->type); check_for_invalid_type (klass); @@ -5805,8 +5675,6 @@ ves_icall_Type_make_byref_type (MonoReflectionType *type) { MonoClass *klass; - MONO_ARCH_SAVE_REGS; - klass = mono_class_from_mono_type (type->type); mono_class_init_or_throw (klass); check_for_invalid_type (klass); @@ -5837,8 +5705,6 @@ ves_icall_System_Delegate_CreateDelegate_internal (MonoReflectionType *type, Mon gpointer func; MonoMethod *method = info->method; - MONO_ARCH_SAVE_REGS; - mono_class_init_or_throw (delegate_class); mono_assert (delegate_class->parent == mono_defaults.multicastdelegate_class); @@ -5964,8 +5830,6 @@ ves_icall_System_CurrentSystemTimeZone_GetTimeZoneData (guint32 year, MonoArray gmtoff_st = gmtoff_ds = transitioned = 0; - MONO_ARCH_SAVE_REGS; - MONO_CHECK_ARG_NULL (data); MONO_CHECK_ARG_NULL (names); @@ -6175,24 +6039,18 @@ mono_array_get_byte_length (MonoArray *array) ICALL_EXPORT gint32 ves_icall_System_Buffer_ByteLengthInternal (MonoArray *array) { - MONO_ARCH_SAVE_REGS; - return mono_array_get_byte_length (array); } ICALL_EXPORT gint8 ves_icall_System_Buffer_GetByteInternal (MonoArray *array, gint32 idx) { - MONO_ARCH_SAVE_REGS; - return mono_array_get (array, gint8, idx); } ICALL_EXPORT void ves_icall_System_Buffer_SetByteInternal (MonoArray *array, gint32 idx, gint8 value) { - MONO_ARCH_SAVE_REGS; - mono_array_set (array, gint8, idx, value); } @@ -6201,8 +6059,6 @@ ves_icall_System_Buffer_BlockCopyInternal (MonoArray *src, gint32 src_offset, Mo { guint8 *src_buf, *dest_buf; - MONO_ARCH_SAVE_REGS; - /* This is called directly from the class libraries without going through the managed wrapper */ MONO_CHECK_ARG_NULL (src); MONO_CHECK_ARG_NULL (dest); @@ -6233,8 +6089,6 @@ ves_icall_Remoting_RealProxy_GetTransparentProxy (MonoObject *this, MonoString * MonoType *type; MonoClass *klass; - MONO_ARCH_SAVE_REGS; - res = mono_object_new (domain, mono_defaults.transparent_proxy_class); tp = (MonoTransparentProxy*) res; @@ -6261,8 +6115,6 @@ ves_icall_Remoting_RealProxy_InternalGetProxyType (MonoTransparentProxy *tp) MonoString* ves_icall_System_Environment_get_UserName (void) { - MONO_ARCH_SAVE_REGS; - /* using glib is more portable */ return mono_string_new (mono_domain_get (), g_get_user_name ()); } @@ -6325,8 +6177,6 @@ ves_icall_System_Environment_get_Platform (void) ICALL_EXPORT MonoString * ves_icall_System_Environment_get_NewLine (void) { - MONO_ARCH_SAVE_REGS; - #if defined (HOST_WIN32) return mono_string_new (mono_domain_get (), "\r\n"); #else @@ -6340,8 +6190,6 @@ ves_icall_System_Environment_GetEnvironmentVariable (MonoString *name) const gchar *value; gchar *utf8_name; - MONO_ARCH_SAVE_REGS; - if (name == NULL) return NULL; @@ -6433,8 +6281,6 @@ ves_icall_System_Environment_GetEnvironmentVariableNames (void) gchar **e, **parts; int n; - MONO_ARCH_SAVE_REGS; - n = 0; for (e = environ; *e != 0; ++ e) ++ n; @@ -6477,8 +6323,6 @@ ves_icall_System_Environment_InternalSetEnvironmentVariable (MonoString *name, M MonoError error; #endif - MONO_ARCH_SAVE_REGS; - #ifdef HOST_WIN32 utf16_name = mono_string_to_utf16 (name); if ((value == NULL) || (mono_string_length (value) == 0) || (mono_string_chars (value)[0] == 0)) { @@ -6517,8 +6361,6 @@ ves_icall_System_Environment_InternalSetEnvironmentVariable (MonoString *name, M ICALL_EXPORT void ves_icall_System_Environment_Exit (int result) { - MONO_ARCH_SAVE_REGS; - mono_environment_exitcode_set (result); /* FIXME: There are some cleanup hangs that should be worked out, but @@ -6579,9 +6421,7 @@ ves_icall_System_Environment_GetLogicalDrives (void) MonoDomain *domain = mono_domain_get (); gint len; - MONO_ARCH_SAVE_REGS; - - buf [0] = '\0'; + buf [0] = '\0'; ptr = buf; while (size > initial_size) { @@ -6634,8 +6474,6 @@ ves_icall_System_IO_DriveInfo_GetDriveFormat (MonoString *path) ICALL_EXPORT MonoString * ves_icall_System_Environment_InternalGetHome (void) { - MONO_ARCH_SAVE_REGS; - return mono_string_new (mono_domain_get (), g_get_home_dir ()); } @@ -6667,7 +6505,7 @@ static const char *encodings [] = { * returns the code page as a string */ ICALL_EXPORT MonoString* -ves_icall_System_Text_Encoding_InternalCodePage (gint32 *int_code_page) +ves_icall_System_Text_EncodingHelper_InternalCodePage (gint32 *int_code_page) { const char *cset; const char *p; @@ -6678,7 +6516,6 @@ ves_icall_System_Text_Encoding_InternalCodePage (gint32 *int_code_page) int i; *int_code_page = -1; - MONO_ARCH_SAVE_REGS; g_get_charset (&cset); c = codepage = strdup (cset); @@ -6741,8 +6578,6 @@ ves_icall_MonoMethodMessage_InitMessage (MonoMethodMessage *this, MonoReflectionMethod *method, MonoArray *out_args) { - MONO_ARCH_SAVE_REGS; - mono_message_init (mono_object_domain (this), this, method, out_args); } @@ -6750,8 +6585,6 @@ ves_icall_MonoMethodMessage_InitMessage (MonoMethodMessage *this, ICALL_EXPORT MonoBoolean ves_icall_IsTransparentProxy (MonoObject *proxy) { - MONO_ARCH_SAVE_REGS; - if (!proxy) return 0; @@ -6819,8 +6652,6 @@ ves_icall_System_Runtime_Activation_ActivationServices_EnableProxyActivation (Mo MonoClass *klass; MonoVTable* vtable; - MONO_ARCH_SAVE_REGS; - klass = mono_class_from_mono_type (type->type); vtable = mono_class_vtable_full (mono_domain_get (), klass, TRUE); @@ -6843,8 +6674,6 @@ ves_icall_System_Runtime_Activation_ActivationServices_AllocateUninitializedClas MonoClass *klass; MonoDomain *domain; - MONO_ARCH_SAVE_REGS; - domain = mono_object_domain (type); klass = mono_class_from_mono_type (type->type); mono_class_init_or_throw (klass); @@ -6864,8 +6693,6 @@ ves_icall_System_Runtime_Activation_ActivationServices_AllocateUninitializedClas ICALL_EXPORT MonoString * ves_icall_System_IO_get_temp_path (void) { - MONO_ARCH_SAVE_REGS; - return mono_string_new (mono_domain_get (), g_get_tmp_dir ()); } @@ -6880,8 +6707,6 @@ ves_icall_System_IO_DriveInfo_GetDiskFreeSpace (MonoString *path_name, guint64 * ULARGE_INTEGER wapi_total_number_of_bytes; ULARGE_INTEGER wapi_total_number_of_free_bytes; - MONO_ARCH_SAVE_REGS; - *error = ERROR_SUCCESS; result = GetDiskFreeSpaceEx (mono_string_chars (path_name), &wapi_free_bytes_avail, &wapi_total_number_of_bytes, &wapi_total_number_of_free_bytes); @@ -6903,8 +6728,6 @@ ves_icall_System_IO_DriveInfo_GetDiskFreeSpace (MonoString *path_name, guint64 * ICALL_EXPORT guint32 ves_icall_System_IO_DriveInfo_GetDriveType (MonoString *root_path_name) { - MONO_ARCH_SAVE_REGS; - return GetDriveType (mono_string_chars (root_path_name)); } #endif @@ -6912,8 +6735,6 @@ ves_icall_System_IO_DriveInfo_GetDriveType (MonoString *root_path_name) ICALL_EXPORT gpointer ves_icall_RuntimeMethod_GetFunctionPointer (MonoMethod *method) { - MONO_ARCH_SAVE_REGS; - return mono_compile_method (method); } @@ -6923,8 +6744,6 @@ ves_icall_System_Configuration_DefaultConfig_get_machine_config_path (void) MonoString *mcpath; gchar *path; - MONO_ARCH_SAVE_REGS; - path = g_build_path (G_DIR_SEPARATOR_S, mono_get_config_dir (), "mono", mono_get_runtime_info ()->framework_version, "machine.config", NULL); #if defined (HOST_WIN32) @@ -6952,8 +6771,6 @@ get_bundled_app_config (void) gsize len; gchar *module; - MONO_ARCH_SAVE_REGS; - domain = mono_domain_get (); file = domain->setup->configuration_file; if (!file) @@ -6986,8 +6803,6 @@ get_bundled_machine_config (void) { const gchar *machine_config; - MONO_ARCH_SAVE_REGS; - machine_config = mono_get_machine_config (); if (!machine_config) @@ -7002,8 +6817,6 @@ ves_icall_System_Web_Util_ICalls_get_machine_install_dir (void) MonoString *ipath; gchar *path; - MONO_ARCH_SAVE_REGS; - path = g_path_get_dirname (mono_get_config_dir ()); #if defined (HOST_WIN32) @@ -7027,8 +6840,6 @@ ves_icall_get_resources_ptr (MonoReflectionAssembly *assembly, gpointer *result, MonoPEResourceDataEntry *entry; MonoImage *image; - MONO_ARCH_SAVE_REGS; - if (!assembly || !result || !size) return FALSE; @@ -7088,8 +6899,6 @@ ves_icall_System_Activator_CreateInstanceInternal (MonoReflectionType *type) MonoClass *klass; MonoDomain *domain; - MONO_ARCH_SAVE_REGS; - domain = mono_object_domain (type); klass = mono_class_from_mono_type (type->type); mono_class_init_or_throw (klass); @@ -7109,8 +6918,6 @@ ves_icall_MonoMethod_get_base_method (MonoReflectionMethod *m, gboolean definiti MonoMethod *result = NULL; int slot; - MONO_ARCH_SAVE_REGS; - if (method->klass == NULL) return m; @@ -7179,8 +6986,6 @@ ves_icall_MonoMethod_get_name (MonoReflectionMethod *m) ICALL_EXPORT void mono_ArgIterator_Setup (MonoArgIterator *iter, char* argsp, char* start) { - MONO_ARCH_SAVE_REGS; - iter->sig = *(MonoMethodSignature**)argsp; g_assert (iter->sig->sentinelpos <= iter->sig->param_count); @@ -7204,7 +7009,6 @@ mono_ArgIterator_IntGetNextArg (MonoArgIterator *iter) guint32 i, arg_size; gint32 align; MonoTypedRef res; - MONO_ARCH_SAVE_REGS; i = iter->sig->sentinelpos + iter->next_arg; @@ -7244,7 +7048,6 @@ mono_ArgIterator_IntGetNextArgT (MonoArgIterator *iter, MonoType *type) guint32 i, arg_size; gint32 align; MonoTypedRef res; - MONO_ARCH_SAVE_REGS; i = iter->sig->sentinelpos + iter->next_arg; @@ -7278,7 +7081,6 @@ ICALL_EXPORT MonoType* mono_ArgIterator_IntGetNextArgType (MonoArgIterator *iter) { gint i; - MONO_ARCH_SAVE_REGS; i = iter->sig->sentinelpos + iter->next_arg; @@ -7290,8 +7092,6 @@ mono_ArgIterator_IntGetNextArgType (MonoArgIterator *iter) ICALL_EXPORT MonoObject* mono_TypedReference_ToObject (MonoTypedRef tref) { - MONO_ARCH_SAVE_REGS; - if (MONO_TYPE_IS_REFERENCE (tref.type)) { MonoObject** objp = tref.value; return *objp; @@ -7303,8 +7103,6 @@ mono_TypedReference_ToObject (MonoTypedRef tref) ICALL_EXPORT MonoObject* mono_TypedReference_ToObjectInternal (MonoType *type, gpointer value, MonoClass *klass) { - MONO_ARCH_SAVE_REGS; - if (MONO_TYPE_IS_REFERENCE (type)) { MonoObject** objp = value; return *objp; @@ -7330,7 +7128,6 @@ prelink_method (MonoMethod *method) ICALL_EXPORT void ves_icall_System_Runtime_InteropServices_Marshal_Prelink (MonoReflectionMethod *method) { - MONO_ARCH_SAVE_REGS; prelink_method (method->method); } @@ -7340,7 +7137,6 @@ ves_icall_System_Runtime_InteropServices_Marshal_PrelinkAll (MonoReflectionType MonoClass *klass = mono_class_from_mono_type (type->type); MonoMethod* m; gpointer iter = NULL; - MONO_ARCH_SAVE_REGS; mono_class_init_or_throw (klass); @@ -7365,44 +7161,14 @@ ves_icall_System_NumberFormatter_GetFormatterTables (guint64 const **mantissas, *decHexDigits = Formatter_DecHexDigits; } +/* These parameters are "readonly" in corlib/System/Globalization/TextInfo.cs */ ICALL_EXPORT void -get_category_data (int version, - guint8 const **category_data, - guint16 const **category_astral_index) -{ - *category_astral_index = NULL; - -#ifndef DISABLE_NET_4_0 - if (version == 4) { - *category_data = CategoryData_v4; -#ifndef DISABLE_ASTRAL - *category_astral_index = CategoryData_v4_astral_index; -#endif - return; - } -#endif - - *category_data = CategoryData_v2; -#ifndef DISABLE_ASTRAL - *category_astral_index = CategoryData_v2_astral_index; -#endif -} - -/* These parameters are "readonly" in corlib/System/Char.cs */ -ICALL_EXPORT void -ves_icall_System_Char_GetDataTablePointers (int category_data_version, - guint8 const **category_data, - guint16 const **category_astral_index, - guint8 const **numeric_data, - gdouble const **numeric_data_values, +ves_icall_System_Globalization_TextInfo_GetDataTablePointersLite ( guint16 const **to_lower_data_low, guint16 const **to_lower_data_high, guint16 const **to_upper_data_low, guint16 const **to_upper_data_high) { - get_category_data (category_data_version, category_data, category_astral_index); - *numeric_data = NumericData; - *numeric_data_values = NumericDataValues; *to_lower_data_low = ToLowerDataLow; *to_lower_data_high = ToLowerDataHigh; *to_upper_data_low = ToUpperDataLow; @@ -7621,131 +7387,6 @@ ves_icall_System_ComponentModel_Win32Exception_W32ErrorMessage (guint32 code) return message; } -const static guchar -dbase64 [] = { - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 62, 128, 128, 128, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 0, 128, 128, - 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 128, 128, 128, 128, 128, - 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 -}; - -static MonoArray * -base64_to_byte_array (gunichar2 *start, gint ilength, MonoBoolean allowWhitespaceOnly) -{ - gint ignored; - gint i; - gunichar2 c; - gunichar2 last, prev_last, prev2_last; - gint olength; - MonoArray *result; - guchar *res_ptr; - gint a [4], b [4]; - MonoException *exc; - - int havePadding = 0; - ignored = 0; - last = prev_last = 0, prev2_last = 0; - for (i = 0; i < ilength; i++) { - c = start [i]; - 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 if (havePadding && c != '=') { - exc = mono_exception_from_name_msg (mono_get_corlib (), - "System", "FormatException", - "Invalid character found."); - mono_raise_exception (exc); - } else { - if (c == '=') havePadding = 1; - prev2_last = prev_last; - 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."); - mono_raise_exception (exc); - } - - if (prev2_last == '=') { - exc = mono_exception_from_name_msg (mono_get_corlib (), "System", "FormatException", "Invalid format."); - mono_raise_exception (exc); - } - - olength = (olength * 3) / 4; - if (last == '=') - olength--; - - if (prev_last == '=') - olength--; - - result = mono_array_new (mono_domain_get (), mono_defaults.byte_class, olength); - res_ptr = mono_array_addr (result, guchar, 0); - for (i = 0; i < ilength; ) { - int 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 (), - "System", "FormatException", - "Invalid character found."); - mono_raise_exception (exc); - } - k++; - } - - *res_ptr++ = (b [0] << 2) | (b [1] >> 4); - if (a [2] != '=') - *res_ptr++ = (b [1] << 4) | (b [2] >> 2); - if (a [3] != '=') - *res_ptr++ = (b [2] << 6) | b [3]; - - while (i < ilength && isspace (start [i])) - i++; - } - - return result; -} - -ICALL_EXPORT MonoArray * -InternalFromBase64String (MonoString *str, MonoBoolean allowWhitespaceOnly) -{ - MONO_ARCH_SAVE_REGS; - - return base64_to_byte_array (mono_string_chars (str), - mono_string_length (str), allowWhitespaceOnly); -} - -ICALL_EXPORT MonoArray * -InternalFromBase64CharArray (MonoArray *input, gint offset, gint length) -{ - MONO_ARCH_SAVE_REGS; - - return base64_to_byte_array (mono_array_addr (input, gunichar2, offset), - length, FALSE); -} - #ifndef DISABLE_ICALL_TABLES #define ICALL_TYPE(id,name,first) @@ -8153,7 +7794,7 @@ mono_lookup_internal_call (MonoMethod *method) g_warning ("cant resolve internal call to \"%s\" (tested without signature also)", mname); g_print ("\nYour mono runtime and class libraries are out of sync.\n"); g_print ("The out of sync library is: %s\n", method->klass->image->name); - g_print ("\nWhen you update one from svn you need to update, compile and install\nthe other too.\n"); + g_print ("\nWhen you update one from git you need to update, compile and install\nthe other too.\n"); g_print ("Do not report this as a bug unless you're sure you have updated correctly:\nyou probably have a broken mono install.\n"); g_print ("If you see other errors or faults after this message they are probably related\n"); g_print ("and you need to fix your mono install first.\n");