X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Ficall.c;h=01be8d10162465eebda5aec982653fd6c1f7bc8e;hb=ff49850dfc18f5991246a203184fa1e0b8a7c7ab;hp=c6addd8c730c6e332da984607377a8dce39431c9;hpb=9a6211315c7540e2a5311556cc2a500cfa9f5f4a;p=mono.git diff --git a/mono/metadata/icall.c b/mono/metadata/icall.c index c6addd8c730..01be8d10162 100644 --- a/mono/metadata/icall.c +++ b/mono/metadata/icall.c @@ -138,19 +138,23 @@ mono_class_init_checked (MonoClass *klass, MonoError *error) ICALL_EXPORT MonoObject * ves_icall_System_Array_GetValueImpl (MonoArray *arr, guint32 pos) { + MonoError error; MonoClass *ac; gint32 esize; gpointer *ea; + MonoObject *result = NULL; ac = (MonoClass *)arr->obj.vtable->klass; esize = mono_array_element_size (ac); ea = (gpointer*)((char*)arr->vector + (pos * esize)); - if (ac->element_class->valuetype) - return mono_value_box (arr->obj.vtable->domain, ac->element_class, ea); - else - return (MonoObject *)*ea; + if (ac->element_class->valuetype) { + result = mono_value_box_checked (arr->obj.vtable->domain, ac->element_class, ea, &error); + mono_error_set_pending_exception (&error); + } else + result = (MonoObject *)*ea; + return result; } ICALL_EXPORT MonoObject * @@ -203,6 +207,7 @@ ves_icall_System_Array_GetValue (MonoArray *arr, MonoArray *idxs) ICALL_EXPORT void ves_icall_System_Array_SetValueImpl (MonoArray *arr, MonoObject *value, guint32 pos) { + MonoError error; MonoClass *ac, *vc, *ec; gint32 esize, vsize; gpointer *ea, *va; @@ -212,6 +217,8 @@ ves_icall_System_Array_SetValueImpl (MonoArray *arr, MonoObject *value, guint32 gint64 i64 = 0; gdouble r64 = 0; + mono_error_init (&error); + if (value) vc = value->vtable->klass; else @@ -289,19 +296,24 @@ ves_icall_System_Array_SetValueImpl (MonoArray *arr, MonoObject *value, guint32 } if (!ec->valuetype) { - if (!mono_object_isinst (value, ec)) + gboolean castOk = (NULL != mono_object_isinst_checked (value, ec, &error)); + if (mono_error_set_pending_exception (&error)) + return; + if (!castOk) INVALID_CAST; mono_gc_wbarrier_set_arrayref (arr, ea, (MonoObject*)value); return; } - if (mono_object_isinst (value, ec)) { + if (mono_object_isinst_checked (value, ec, &error)) { if (ec->has_references) mono_value_copy (ea, (char*)value + sizeof (MonoObject), ec); else mono_gc_memmove_atomic (ea, (char *)value + sizeof (MonoObject), esize); return; } + if (mono_error_set_pending_exception (&error)) + return; if (!vc->valuetype) INVALID_CAST; @@ -1256,6 +1268,15 @@ ves_icall_System_Reflection_Emit_AssemblyBuilder_InternalAddModule (MonoReflecti return result; } +ICALL_EXPORT MonoArray* +ves_icall_System_Reflection_Emit_CustomAttributeBuilder_GetBlob (MonoReflectionAssembly *assembly, MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *propValues, MonoArray *fields, MonoArray* fieldValues) +{ + MonoError error; + MonoArray *result = mono_reflection_get_custom_attrs_blob_checked (assembly, ctor, ctorArgs, properties, propValues, fields, fieldValues, &error); + mono_error_set_pending_exception (&error); + return result; +} + static gboolean get_caller (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data) { @@ -1364,15 +1385,19 @@ type_from_parsed_name (MonoTypeNameParse *info, MonoBoolean ignoreCase, MonoErro if (assembly) { /* When loading from the current assembly, AppDomain.TypeResolve will not be called yet */ - type = mono_reflection_get_type (assembly->image, info, ignoreCase, &type_resolve); + type = mono_reflection_get_type_checked (assembly->image, info, ignoreCase, &type_resolve, error); + return_val_if_nok (error, NULL); } - if (!info->assembly.name && !type) /* try mscorlib */ - type = mono_reflection_get_type (NULL, info, ignoreCase, &type_resolve); - + if (!info->assembly.name && !type) { + /* try mscorlib */ + type = mono_reflection_get_type_checked (NULL, info, ignoreCase, &type_resolve, error); + return_val_if_nok (error, NULL); + } if (assembly && !type && type_resolve) { type_resolve = FALSE; /* This will invoke TypeResolve if not done in the first 'if' */ - type = mono_reflection_get_type (assembly->image, info, ignoreCase, &type_resolve); + type = mono_reflection_get_type_checked (assembly->image, info, ignoreCase, &type_resolve, error); + return_val_if_nok (error, NULL); } if (!type) @@ -1613,8 +1638,13 @@ ves_icall_RuntimeTypeHandle_IsInstanceOfType (MonoReflectionType *type, MonoObje MonoError error; MonoClass *klass = mono_class_from_mono_type (type->type); mono_class_init_checked (klass, &error); - mono_error_raise_exception (&error); - return mono_object_isinst (obj, klass) != NULL; + if (!is_ok (&error)) { + mono_error_set_pending_exception (&error); + return FALSE; + } + guint32 result = (mono_object_isinst_checked (obj, klass, &error) != NULL); + mono_error_set_pending_exception (&error); + return result; } ICALL_EXPORT guint32 @@ -2473,9 +2503,12 @@ ves_icall_RuntimeTypeHandle_IsComObject (MonoReflectionType *type) } ICALL_EXPORT guint32 -ves_icall_RuntimeTypeHandle_GetMetadataToken (MonoReflectionType *obj) +ves_icall_reflection_get_token (MonoObject* obj) { - return mono_reflection_get_token ((MonoObject*)obj); + MonoError error; + guint32 result = mono_reflection_get_token_checked (obj, &error); + mono_error_set_pending_exception (&error); + return result; } ICALL_EXPORT MonoReflectionModule* @@ -2694,10 +2727,12 @@ ves_icall_Type_MakeGenericType (MonoReflectionType *type, MonoArray *type_array) types [i] = t->type; } - geninst = mono_reflection_bind_generic_parameters (type, count, types); + geninst = mono_reflection_bind_generic_parameters (type, count, types, &error); g_free (types); - if (!geninst) + if (!geninst) { + mono_error_set_pending_exception (&error); return NULL; + } klass = mono_class_from_mono_type (geninst); @@ -3045,7 +3080,11 @@ ves_icall_InternalInvoke (MonoReflectionMethod *method, MonoObject *this_arg, Mo } if (this_arg) { - if (!mono_object_isinst (this_arg, m->klass)) { + if (!mono_object_isinst_checked (this_arg, m->klass, &error)) { + if (!is_ok (&error)) { + mono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_error_convert_to_exception (&error)); + return NULL; + } char *this_name = mono_type_get_full_name (mono_object_get_class (this_arg)); char *target_name = mono_type_get_full_name (m->klass); char *msg = g_strdup_printf ("Object of type '%s' doesn't match target type '%s'", this_name, target_name); @@ -3157,6 +3196,7 @@ ves_icall_InternalInvoke (MonoReflectionMethod *method, MonoObject *this_arg, Mo ICALL_EXPORT MonoObject * ves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this_arg, MonoArray *params, MonoArray **outArgs) { + MonoError error; MonoDomain *domain = mono_object_domain (method); MonoMethod *m = method->method; MonoMethodSignature *sig = mono_method_signature (m); @@ -3185,9 +3225,11 @@ ves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this_arg, M MonoClassField* field = mono_class_get_field_from_name (k, str); if (field) { MonoClass *field_klass = mono_class_from_mono_type (field->type); - if (field_klass->valuetype) - result = mono_value_box (domain, field_klass, (char *)this_arg + field->offset); - else + if (field_klass->valuetype) { + result = mono_value_box_checked (domain, field_klass, (char *)this_arg + field->offset, &error); + mono_error_set_pending_exception (&error); + /* fallthru to cleanup */ + } else result = (MonoObject *)*((gpointer *)((char *)this_arg + field->offset)); out_args = mono_array_new (domain, mono_defaults.object_class, 1); @@ -4348,8 +4390,7 @@ ves_icall_Type_GetNestedTypes (MonoReflectionType *type, MonoString *name, guint mono_ptr_array_destroy (tmp_array); - if (!str) - g_free (str); + g_free (str); return res; } @@ -4394,9 +4435,15 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as } if (module != NULL) { - if (module->image) - type = mono_reflection_get_type (module->image, &info, ignoreCase, &type_resolve); - else + if (module->image) { + type = mono_reflection_get_type_checked (module->image, &info, ignoreCase, &type_resolve, &error); + if (!is_ok (&error)) { + g_free (str); + mono_reflection_free_type_info (&info); + mono_error_set_pending_exception (&error); + return NULL; + } + } else type = NULL; } else @@ -4409,7 +4456,13 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as if (abuilder->modules) { for (i = 0; i < mono_array_length (abuilder->modules); ++i) { MonoReflectionModuleBuilder *mb = mono_array_get (abuilder->modules, MonoReflectionModuleBuilder*, i); - type = mono_reflection_get_type (&mb->dynamic_image->image, &info, ignoreCase, &type_resolve); + type = mono_reflection_get_type_checked (&mb->dynamic_image->image, &info, ignoreCase, &type_resolve, &error); + if (!is_ok (&error)) { + g_free (str); + mono_reflection_free_type_info (&info); + mono_error_set_pending_exception (&error); + return NULL; + } if (type) break; } @@ -4418,14 +4471,27 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as if (!type && abuilder->loaded_modules) { for (i = 0; i < mono_array_length (abuilder->loaded_modules); ++i) { MonoReflectionModule *mod = mono_array_get (abuilder->loaded_modules, MonoReflectionModule*, i); - type = mono_reflection_get_type (mod->image, &info, ignoreCase, &type_resolve); + type = mono_reflection_get_type_checked (mod->image, &info, ignoreCase, &type_resolve, &error); + if (!is_ok (&error)) { + g_free (str); + mono_reflection_free_type_info (&info); + mono_error_set_pending_exception (&error); + return NULL; + } if (type) break; } } } - else - type = mono_reflection_get_type (assembly->assembly->image, &info, ignoreCase, &type_resolve); + else { + type = mono_reflection_get_type_checked (assembly->assembly->image, &info, ignoreCase, &type_resolve, &error); + if (!is_ok (&error)) { + g_free (str); + mono_reflection_free_type_info (&info); + mono_error_set_pending_exception (&error); + return NULL; + } + } g_free (str); mono_reflection_free_type_info (&info); if (!type) { @@ -4465,7 +4531,7 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as /* g_print ("got it\n"); */ ret = mono_type_get_object_checked (mono_object_domain (assembly), type, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return ret; } @@ -5103,7 +5169,10 @@ ves_icall_System_Reflection_MethodBase_GetMethodFromHandleInternalType (MonoMeth ICALL_EXPORT MonoReflectionMethodBody* ves_icall_System_Reflection_MethodBase_GetMethodBodyInternal (MonoMethod *method) { - return mono_method_body_get_object (mono_domain_get (), method); + MonoError error; + MonoReflectionMethodBody *result = mono_method_body_get_object_checked (mono_domain_get (), method, &error); + mono_error_set_pending_exception (&error); + return result; } ICALL_EXPORT MonoReflectionAssembly* @@ -5481,7 +5550,6 @@ mono_module_get_types (MonoDomain *domain, MonoImage *image, MonoArray **excepti if (!exportedOnly || mono_module_type_is_visible (tdef, image, i + 1)) { klass = mono_class_get_checked (image, (i + 1) | MONO_TOKEN_TYPE_DEF, error); mono_loader_assert_no_error (); /* Plug any leaks */ - mono_error_assert_ok (error); if (klass) { rt = mono_type_get_object_checked (domain, &klass->byval_arg, error); @@ -5757,10 +5825,13 @@ mono_memberref_is_method (MonoImage *image, guint32 token) mono_metadata_decode_blob_size (sig, &sig); return (*sig != 0x6); } else { + MonoError error; MonoClass *handle_class; - if (!mono_lookup_dynamic_token_class (image, token, FALSE, &handle_class, NULL)) + if (!mono_lookup_dynamic_token_class (image, token, FALSE, &handle_class, NULL, &error)) { + mono_error_cleanup (&error); /* just probing, ignore error */ return FALSE; + } return mono_defaults.methodhandle_class == handle_class; } @@ -5801,12 +5872,14 @@ ves_icall_System_Reflection_Module_ResolveTypeToken (MonoImage *image, guint32 t if (image_is_dynamic (image)) { if ((table == MONO_TABLE_TYPEDEF) || (table == MONO_TABLE_TYPEREF)) { - klass = (MonoClass *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL); + klass = (MonoClass *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL, &error); + mono_error_cleanup (&error); return klass ? &klass->byval_arg : NULL; } init_generic_context_from_args (&context, type_args, method_args); - klass = (MonoClass *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, &context); + klass = (MonoClass *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, &context, &error); + mono_error_cleanup (&error); return klass ? &klass->byval_arg : NULL; } @@ -5849,8 +5922,11 @@ ves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32 } if (image_is_dynamic (image)) { - if (table == MONO_TABLE_METHOD) - return (MonoMethod *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL); + if (table == MONO_TABLE_METHOD) { + method = (MonoMethod *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL, &error); + mono_error_cleanup (&error); + return method; + } if ((table == MONO_TABLE_MEMBERREF) && !(mono_memberref_is_method (image, token))) { *resolve_error = ResolveTokenError_BadTable; @@ -5858,7 +5934,9 @@ ves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32 } init_generic_context_from_args (&context, type_args, method_args); - return (MonoMethod *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, &context); + method = (MonoMethod *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, &context, &error); + mono_error_cleanup (&error); + return method; } if ((index <= 0) || (index > image->tables [table].rows)) { @@ -5878,23 +5956,27 @@ ves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32 } ICALL_EXPORT MonoString* -ves_icall_System_Reflection_Module_ResolveStringToken (MonoImage *image, guint32 token, MonoResolveTokenError *error) +ves_icall_System_Reflection_Module_ResolveStringToken (MonoImage *image, guint32 token, MonoResolveTokenError *resolve_error) { + MonoError error; int index = mono_metadata_token_index (token); - *error = ResolveTokenError_Other; + *resolve_error = ResolveTokenError_Other; /* Validate token */ if (mono_metadata_token_code (token) != MONO_TOKEN_STRING) { - *error = ResolveTokenError_BadTable; + *resolve_error = ResolveTokenError_BadTable; return NULL; } - if (image_is_dynamic (image)) - return (MonoString *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL); + if (image_is_dynamic (image)) { + MonoString * result = (MonoString *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL, &error); + mono_error_cleanup (&error); + return result; + } if ((index <= 0) || (index >= image->heap_us.size)) { - *error = ResolveTokenError_OutOfRange; + *resolve_error = ResolveTokenError_OutOfRange; return NULL; } @@ -5922,8 +6004,11 @@ ves_icall_System_Reflection_Module_ResolveFieldToken (MonoImage *image, guint32 } if (image_is_dynamic (image)) { - if (table == MONO_TABLE_FIELD) - return (MonoClassField *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL); + if (table == MONO_TABLE_FIELD) { + field = (MonoClassField *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL, &error); + mono_error_cleanup (&error); + return field; + } if (mono_memberref_is_method (image, token)) { *resolve_error = ResolveTokenError_BadTable; @@ -5931,7 +6016,9 @@ ves_icall_System_Reflection_Module_ResolveFieldToken (MonoImage *image, guint32 } init_generic_context_from_args (&context, type_args, method_args); - return (MonoClassField *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, &context); + field = (MonoClassField *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, &context, &error); + mono_error_cleanup (&error); + return field; } if ((index <= 0) || (index > image->tables [table].rows)) { @@ -6230,7 +6317,14 @@ ves_icall_System_Delegate_CreateDelegate_internal (MonoReflectionType *type, Mon mono_class_init_checked (delegate_class, &error); mono_error_raise_exception (&error); - mono_assert (delegate_class->parent == mono_defaults.multicastdelegate_class); + if (!(delegate_class->parent == mono_defaults.multicastdelegate_class)) { + /* FIXME improve this exception message */ + mono_error_set_execution_engine (&error, "file %s: line %d (%s): assertion failed: (%s)", __FILE__, __LINE__, + __func__, + "delegate_class->parent == mono_defaults.multicastdelegate_class"); + mono_error_set_pending_exception (&error); + return NULL; + } if (mono_security_core_clr_enabled ()) { if (!mono_security_core_clr_ensure_delegate_creation (method, throwOnBindFailure)) @@ -6400,7 +6494,11 @@ ves_icall_Remoting_RealProxy_GetTransparentProxy (MonoObject *this_obj, MonoStri return NULL; } - tp->custom_type_info = (mono_object_isinst (this_obj, mono_defaults.iremotingtypeinfo_class) != NULL); + tp->custom_type_info = (mono_object_isinst_checked (this_obj, mono_defaults.iremotingtypeinfo_class, &error) != NULL); + if (!is_ok (&error)) { + mono_error_set_pending_exception (&error); + return NULL; + } tp->remote_class = mono_remote_class (domain, class_name, klass, &error); if (!is_ok (&error)) { mono_error_set_pending_exception (&error); @@ -7559,12 +7657,16 @@ mono_ArgIterator_IntGetNextArgType (MonoArgIterator *iter) ICALL_EXPORT MonoObject* mono_TypedReference_ToObject (MonoTypedRef* tref) { + MonoError error; + MonoObject *result = NULL; if (MONO_TYPE_IS_REFERENCE (tref->type)) { MonoObject** objp = (MonoObject **)tref->value; return *objp; } - return mono_value_box (mono_domain_get (), tref->klass, tref->value); + result = mono_value_box_checked (mono_domain_get (), tref->klass, tref->value, &error); + mono_error_set_pending_exception (&error); + return result; } ICALL_EXPORT MonoTypedRef @@ -7920,20 +8022,6 @@ ves_icall_System_ComponentModel_Win32Exception_W32ErrorMessage (guint32 code) return message; } -ICALL_EXPORT int -ves_icall_System_StackFrame_GetILOffsetFromFile (MonoString *path, guint32 method_token, guint32 method_index, int native_offset) -{ - guint32 il_offset; - char *path_str = mono_string_to_utf8 (path); - - if (!mono_seq_point_data_get_il_offset (path_str, method_token, method_index, native_offset, &il_offset)) - il_offset = -1; - - g_free (path_str); - - return il_offset; -} - ICALL_EXPORT gpointer ves_icall_Microsoft_Win32_NativeMethods_GetCurrentProcess (void) {