#include <mono/metadata/object.h>
#include <mono/metadata/threads.h>
#include <mono/metadata/threads-types.h>
-#include <mono/metadata/threadpool-ms.h>
-#include <mono/metadata/threadpool-ms-io.h>
+#include <mono/metadata/threadpool.h>
+#include <mono/metadata/threadpool-io.h>
#include <mono/metadata/monitor.h>
#include <mono/metadata/reflection.h>
#include <mono/metadata/image-internals.h>
#include <mono/metadata/socket-io.h>
#include <mono/metadata/mono-endian.h>
#include <mono/metadata/tokentype.h>
-#include <mono/metadata/domain-internals.h>
#include <mono/metadata/metadata-internals.h>
#include <mono/metadata/class-internals.h>
#include <mono/metadata/reflection-internals.h>
#include <mono/metadata/mono-gc.h>
#include <mono/metadata/rand.h>
#include <mono/metadata/sysmath.h>
+#include <mono/metadata/appdomain-icalls.h>
#include <mono/metadata/string-icalls.h>
#include <mono/metadata/debug-helpers.h>
-#include <mono/metadata/process.h>
+#include <mono/metadata/w32process.h>
#include <mono/metadata/environment.h>
#include <mono/metadata/profiler-private.h>
#include <mono/metadata/locales.h>
#include <sys/utsname.h>
#endif
-#if HAVE_BTLS
-#include <btls/btls-ssl.h>
-#include <btls/btls-bio.h>
-#include <btls/btls-error.h>
-#include <btls/btls-key.h>
-#include <btls/btls-pkcs12.h>
-#include <btls/btls-x509-crl.h>
-#include <btls/btls-x509-chain.h>
-#include <btls/btls-x509-lookup.h>
-#include <btls/btls-x509-lookup-mono.h>
-#include <btls/btls-x509-name.h>
-#include <btls/btls-x509-revoked.h>
-#include <btls/btls-x509-store-ctx.h>
-#include <btls/btls-x509-verify-param.h>
-#endif
-
extern MonoString* ves_icall_System_Environment_GetOSVersionString (void);
-ICALL_EXPORT MonoReflectionAssembly* ves_icall_System_Reflection_Assembly_GetCallingAssembly (void);
+ICALL_EXPORT MonoReflectionAssemblyHandle ves_icall_System_Reflection_Assembly_GetCallingAssembly (MonoError *error);
/* Lazy class loading functions */
static GENERATE_GET_CLASS_WITH_CACHE (system_version, System, Version)
static GENERATE_GET_CLASS_WITH_CACHE (event_info, System.Reflection, EventInfo)
static GENERATE_GET_CLASS_WITH_CACHE (module, System.Reflection, Module)
-static MonoArray*
+static MonoArrayHandle
type_array_from_modifiers (MonoImage *image, MonoType *type, int optional, MonoError *error);
static inline MonoBoolean
}
ICALL_EXPORT void
-ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_InitializeArray (MonoArray *array, MonoClassField *field_handle)
+ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_InitializeArray (MonoArrayHandle array, MonoClassField *field_handle, MonoError *error)
{
- MonoClass *klass = array->obj.vtable->klass;
+ mono_error_init (error);
+
+ MonoClass *klass = mono_handle_class (array);
guint32 size = mono_array_element_size (klass);
MonoType *type = mono_type_get_underlying_type (&klass->element_class->byval_arg);
int align;
const char *field_data;
if (MONO_TYPE_IS_REFERENCE (type) || type->type == MONO_TYPE_VALUETYPE) {
- MonoException *exc = mono_get_exception_argument("array",
- "Cannot initialize array of non-primitive type.");
- mono_set_pending_exception (exc);
+ mono_error_set_argument (error, "array", "Cannot initialize array of non-primitive type");
return;
}
if (!(field_handle->type->attrs & FIELD_ATTRIBUTE_HAS_FIELD_RVA)) {
- MonoException *exc = mono_get_exception_argument("field_handle",
- "Field doesn't have an RVA");
- mono_set_pending_exception (exc);
+ mono_error_set_argument (error, "field_handle", "Field '%s' doesn't have an RVA", mono_field_get_name (field_handle));
return;
}
- size *= array->max_length;
+ size *= MONO_HANDLE_GETVAL(array, max_length);
field_data = mono_field_get_data (field_handle);
if (size > mono_type_size (field_handle->type, &align)) {
- MonoException *exc = mono_get_exception_argument("field_handle",
- "Field not large enough to fill array");
- mono_set_pending_exception (exc);
+ mono_error_set_argument (error, "field_handle", "Field not large enough to fill array");
return;
}
#if G_BYTE_ORDER != G_LITTLE_ENDIAN
#define SWAP(n) { \
- guint ## n *data = (guint ## n *) mono_array_addr (array, char, 0); \
+ guint ## n *data = (guint ## n *) mono_array_addr (MONO_HANDLE_RAW(array), char, 0); \
guint ## n *src = (guint ## n *) field_data; \
int i, \
nEnt = (size / sizeof(guint ## n)); \
SWAP (64);
break;
default:
- memcpy (mono_array_addr (array, char, 0), field_data, size);
+ memcpy (mono_array_addr (MONO_HANDLE_RAW(array), char, 0), field_data, size);
break;
}
#else
- memcpy (mono_array_addr (array, char, 0), field_data, size);
+ memcpy (mono_array_addr (MONO_HANDLE_RAW(array), char, 0), field_data, size);
#endif
}
klass = mono_class_from_mono_type (handle);
MONO_CHECK_ARG (handle, klass,);
- if (klass->generic_container)
+ if (mono_class_is_gtd (klass))
return;
vtable = mono_class_vtable_full (mono_domain_get (), klass, &error);
// .net seems to check that at least 50% of stack is available
min_size = thread->stack_size / 2;
+ // TODO: It's not always set
+ if (!min_size)
+ return TRUE;
+
current = (guint8 *)&stack_addr;
if (current > stack_addr) {
if ((current - stack_addr) < min_size)
}
}
-ICALL_EXPORT MonoReflectionType *
-ves_icall_System_Object_GetType (MonoObject *obj)
+ICALL_EXPORT MonoReflectionTypeHandle
+ves_icall_System_Object_GetType (MonoObjectHandle obj, MonoError *error)
{
- MonoError error;
- MonoReflectionType *ret;
+ mono_error_init (error);
+ MonoDomain *domain = MONO_HANDLE_DOMAIN (obj);
+ MonoClass *klass = mono_handle_class (obj);
#ifndef DISABLE_REMOTING
- if (obj->vtable->klass == mono_defaults.transparent_proxy_class)
- ret = mono_type_get_object_checked (mono_object_domain (obj), &((MonoTransparentProxy*)obj)->remote_class->proxy_class->byval_arg, &error);
- else
+ if (klass == mono_defaults.transparent_proxy_class) {
+ MonoTransparentProxyHandle proxy_obj = MONO_HANDLE_CAST (MonoTransparentProxy, obj);
+ MonoRemoteClass *remote_class = MONO_HANDLE_GETVAL (proxy_obj, remote_class);
+ MonoType *proxy_type = &remote_class->proxy_class->byval_arg;
+ return mono_type_get_object_handle (domain, proxy_type, error);
+ } else
#endif
- ret = mono_type_get_object_checked (mono_object_domain (obj), &obj->vtable->klass->byval_arg, &error);
-
- mono_error_set_pending_exception (&error);
- return ret;
+ return mono_type_get_object_handle (domain, &klass->byval_arg, error);
}
static gboolean
return FALSE;
}
-static MonoReflectionType *
-type_from_parsed_name (MonoTypeNameParse *info, MonoBoolean ignoreCase, MonoError *error)
+static MonoReflectionTypeHandle
+type_from_parsed_name (MonoTypeNameParse *info, MonoBoolean ignoreCase, MonoAssembly **caller_assembly, MonoError *error)
{
MonoMethod *m, *dest;
} else {
g_warning (G_STRLOC);
}
+ *caller_assembly = assembly;
if (info->assembly.name)
assembly = mono_assembly_load (&info->assembly, assembly ? assembly->basedir : NULL, NULL);
if (assembly) {
/* When loading from the current assembly, AppDomain.TypeResolve will not be called yet */
type = mono_reflection_get_type_checked (rootimage, assembly->image, info, ignoreCase, &type_resolve, error);
- return_val_if_nok (error, NULL);
+ if (!is_ok (error))
+ goto fail;
}
// XXXX - aleksey -
if (!info->assembly.name && !type) {
/* try mscorlib */
type = mono_reflection_get_type_checked (rootimage, NULL, info, ignoreCase, &type_resolve, error);
- return_val_if_nok (error, NULL);
+ if (!is_ok (error))
+ goto fail;
}
if (assembly && !type && type_resolve) {
type_resolve = FALSE; /* This will invoke TypeResolve if not done in the first 'if' */
type = mono_reflection_get_type_checked (rootimage, assembly->image, info, ignoreCase, &type_resolve, error);
- return_val_if_nok (error, NULL);
+ if (!is_ok (error))
+ goto fail;
}
if (!type)
- return NULL;
+ goto fail;
- return mono_type_get_object_checked (mono_domain_get (), type, error);
+ return mono_type_get_object_handle (mono_domain_get (), type, error);
+fail:
+ return MONO_HANDLE_NEW (MonoReflectionType, NULL);
}
-ICALL_EXPORT MonoReflectionType*
-ves_icall_System_Type_internal_from_name (MonoString *name,
- MonoBoolean throwOnError,
- MonoBoolean ignoreCase)
+ICALL_EXPORT MonoReflectionTypeHandle
+ves_icall_System_Type_internal_from_name (MonoStringHandle name,
+ MonoBoolean throwOnError,
+ MonoBoolean ignoreCase,
+ MonoError *error)
{
- MonoError error;
+ mono_error_init (error);
MonoTypeNameParse info;
- MonoReflectionType *type = NULL;
gboolean parsedOk;
+ MonoAssembly *caller_assembly;
- char *str = mono_string_to_utf8_checked (name, &error);
- if (!is_ok (&error))
+ char *str = mono_string_handle_to_utf8 (name, error);
+ if (!is_ok (error))
goto leave;
parsedOk = mono_reflection_parse_type (str, &info);
if (!parsedOk) {
mono_reflection_free_type_info (&info);
if (throwOnError)
- mono_error_set_argument (&error, "typeName", "failed parse: %s", str);
+ mono_error_set_argument (error, "typeName", "failed parse: %s", str);
goto leave;
}
- type = type_from_parsed_name (&info, ignoreCase, &error);
-
- mono_reflection_free_type_info (&info);
+ MonoReflectionTypeHandle type = type_from_parsed_name (&info, ignoreCase, &caller_assembly, error);
- if (!is_ok (&error))
+ if (!is_ok (error)) {
+ mono_reflection_free_type_info (&info);
goto leave;
+ }
- if (type == NULL){
+ if (MONO_HANDLE_IS_NULL (type)) {
if (throwOnError) {
- mono_error_set_type_load_name (&error, g_strdup (str), g_strdup (""), "");
- goto leave;
+ char *tname = info.name_space ? g_strdup_printf ("%s.%s", info.name_space, info.name) : g_strdup (info.name);
+ char *aname;
+ if (info.assembly.name)
+ aname = mono_stringify_assembly_name (&info.assembly);
+ else if (caller_assembly)
+ aname = mono_stringify_assembly_name (mono_assembly_get_name (caller_assembly));
+ else
+ aname = g_strdup ("");
+ mono_error_set_type_load_name (error, tname, aname, "");
}
+ mono_reflection_free_type_info (&info);
+ goto leave;
}
leave:
g_free (str);
- if (!is_ok (&error)) {
- if (throwOnError)
- mono_error_set_pending_exception (&error);
- else
- mono_error_cleanup (&error);
- return NULL;
+ if (!is_ok (error)) {
+ if (!throwOnError)
+ mono_error_cleanup (error);
+ return MONO_HANDLE_CAST (MonoReflectionType, NULL_HANDLE);
}
return type;
}
-ICALL_EXPORT MonoReflectionType*
-ves_icall_System_Type_internal_from_handle (MonoType *handle)
+ICALL_EXPORT MonoReflectionTypeHandle
+ves_icall_System_Type_internal_from_handle (MonoType *handle, MonoError *error)
{
- MonoError error;
- MonoReflectionType *ret;
+ mono_error_init (error);
MonoDomain *domain = mono_domain_get ();
- ret = mono_type_get_object_checked (domain, handle, &error);
- mono_error_set_pending_exception (&error);
-
- return ret;
+ return mono_type_get_object_handle (domain, handle, error);
}
ICALL_EXPORT MonoType*
return 0;
}
-static gboolean
-mono_type_is_primitive (MonoType *type)
-{
- return (type->type >= MONO_TYPE_BOOLEAN && type->type <= MONO_TYPE_R8) ||
- type-> type == MONO_TYPE_I || type->type == MONO_TYPE_U;
-}
-
static MonoType*
mono_type_get_underlying_type_ignore_byref (MonoType *type)
{
}
ICALL_EXPORT guint32
-ves_icall_RuntimeTypeHandle_type_is_assignable_from (MonoReflectionType *type, MonoReflectionType *c)
+ves_icall_RuntimeTypeHandle_type_is_assignable_from (MonoReflectionTypeHandle ref_type, MonoReflectionTypeHandle ref_c, MonoError *error)
{
- MonoClass *klass;
- MonoClass *klassc;
+ mono_error_init (error);
- g_assert (type != NULL);
+ g_assert (!MONO_HANDLE_IS_NULL (ref_type));
- klass = mono_class_from_mono_type (type->type);
- klassc = mono_class_from_mono_type (c->type);
+ MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
+ MonoClass *klass = mono_class_from_mono_type (type);
+ MonoType *ctype = MONO_HANDLE_GETVAL (ref_c, type);
+ MonoClass *klassc = mono_class_from_mono_type (ctype);
- if (type->type->byref ^ c->type->byref)
+ if (type->byref ^ ctype->byref)
return FALSE;
- if (type->type->byref) {
- MonoType *t = mono_type_get_underlying_type_ignore_byref (type->type);
- MonoType *ot = mono_type_get_underlying_type_ignore_byref (c->type);
+ if (type->byref) {
+ MonoType *t = mono_type_get_underlying_type_ignore_byref (type);
+ MonoType *ot = mono_type_get_underlying_type_ignore_byref (ctype);
klass = mono_class_from_mono_type (t);
klassc = mono_class_from_mono_type (ot);
}
ICALL_EXPORT guint32
-ves_icall_RuntimeTypeHandle_GetAttributes (MonoReflectionType *type)
+ves_icall_RuntimeTypeHandle_GetAttributes (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- MonoClass *klass = mono_class_from_mono_type (type->type);
- return klass->flags;
+ mono_error_init (error);
+ MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
+ MonoClass *klass = mono_class_from_mono_type (type);
+ return mono_class_get_flags (klass);
}
-ICALL_EXPORT MonoReflectionMarshalAsAttribute*
-ves_icall_System_Reflection_FieldInfo_get_marshal_info (MonoReflectionField *field)
+ICALL_EXPORT MonoReflectionMarshalAsAttributeHandle
+ves_icall_System_Reflection_FieldInfo_get_marshal_info (MonoReflectionFieldHandle field_h, MonoError *error)
{
- MonoError error;
- MonoClass *klass = field->field->parent;
- MonoMarshalType *info;
- MonoType *ftype;
- int i;
+ mono_error_init (error);
+ MonoDomain *domain = MONO_HANDLE_DOMAIN (field_h);
+ MonoClassField *field = MONO_HANDLE_GETVAL (field_h, field);
+ MonoClass *klass = field->parent;
- if (klass->generic_container ||
- (klass->generic_class && klass->generic_class->context.class_inst->is_open))
- return NULL;
+ MonoGenericClass *gklass = mono_class_try_get_generic_class (klass);
+ if (mono_class_is_gtd (klass) ||
+ (gklass && gklass->context.class_inst->is_open))
+ return MONO_HANDLE_CAST (MonoReflectionMarshalAsAttribute, NULL_HANDLE);
- ftype = mono_field_get_type (field->field);
+ MonoType *ftype = mono_field_get_type (field);
if (ftype && !(ftype->attrs & FIELD_ATTRIBUTE_HAS_FIELD_MARSHAL))
- return NULL;
+ return MONO_HANDLE_CAST (MonoReflectionMarshalAsAttribute, NULL_HANDLE);
- info = mono_marshal_load_type_info (klass);
+ MonoMarshalType *info = mono_marshal_load_type_info (klass);
- for (i = 0; i < info->num_fields; ++i) {
- if (info->fields [i].field == field->field) {
+ for (int i = 0; i < info->num_fields; ++i) {
+ if (info->fields [i].field == field) {
if (!info->fields [i].mspec)
- return NULL;
+ return MONO_HANDLE_CAST (MonoReflectionMarshalAsAttribute, NULL_HANDLE);
else {
- MonoReflectionMarshalAsAttribute* obj;
- obj = mono_reflection_marshal_as_attribute_from_marshal_spec (field->object.vtable->domain, klass, info->fields [i].mspec, &error);
- if (!mono_error_ok (&error))
- mono_error_set_pending_exception (&error);
- return obj;
+ return mono_reflection_marshal_as_attribute_from_marshal_spec (domain, klass, info->fields [i].mspec, error);
}
}
}
- return NULL;
+ return MONO_HANDLE_CAST (MonoReflectionMarshalAsAttribute, NULL_HANDLE);
}
-ICALL_EXPORT MonoReflectionField*
-ves_icall_System_Reflection_FieldInfo_internal_from_handle_type (MonoClassField *handle, MonoType *type)
+ICALL_EXPORT MonoReflectionFieldHandle
+ves_icall_System_Reflection_FieldInfo_internal_from_handle_type (MonoClassField *handle, MonoType *type, MonoError *error)
{
- MonoError error;
- gboolean found = FALSE;
MonoClass *klass;
g_assert (handle);
+ mono_error_init (error);
+
if (!type) {
klass = handle->parent;
} else {
klass = mono_class_from_mono_type (type);
- found = klass == handle->parent || mono_class_has_parent (klass, handle->parent);
+ gboolean found = klass == handle->parent || mono_class_has_parent (klass, handle->parent);
if (!found)
/* The managed code will throw the exception */
- return NULL;
+ return MONO_HANDLE_CAST (MonoReflectionField, NULL_HANDLE);
}
- MonoReflectionField *result = mono_field_get_object_checked (mono_domain_get (), klass, handle, &error);
- mono_error_set_pending_exception (&error);
- return result;
+ return mono_field_get_object_handle (mono_domain_get (), klass, handle, error);
}
-ICALL_EXPORT MonoReflectionEvent*
-ves_icall_System_Reflection_EventInfo_internal_from_handle_type (MonoEvent *handle, MonoType *type)
+ICALL_EXPORT MonoReflectionEventHandle
+ves_icall_System_Reflection_EventInfo_internal_from_handle_type (MonoEvent *handle, MonoType *type, MonoError *error)
{
- MonoError error;
MonoClass *klass;
g_assert (handle);
+ mono_error_init (error);
+
if (!type) {
klass = handle->parent;
} else {
gboolean found = klass == handle->parent || mono_class_has_parent (klass, handle->parent);
if (!found)
/* Managed code will throw an exception */
- return NULL;
+ return MONO_HANDLE_CAST (MonoReflectionEvent, NULL_HANDLE);
}
- MonoReflectionEvent *result = mono_event_get_object_checked (mono_domain_get (), klass, handle, &error);
- mono_error_set_pending_exception (&error);
- return result;
+ return mono_event_get_object_handle (mono_domain_get (), klass, handle, error);
}
-ICALL_EXPORT MonoReflectionProperty*
-ves_icall_System_Reflection_PropertyInfo_internal_from_handle_type (MonoProperty *handle, MonoType *type)
+ICALL_EXPORT MonoReflectionPropertyHandle
+ves_icall_System_Reflection_PropertyInfo_internal_from_handle_type (MonoProperty *handle, MonoType *type, MonoError *error)
{
- MonoError error;
+ mono_error_init (error);
MonoClass *klass;
g_assert (handle);
gboolean found = klass == handle->parent || mono_class_has_parent (klass, handle->parent);
if (!found)
/* Managed code will throw an exception */
- return NULL;
+ return MONO_HANDLE_CAST (MonoReflectionProperty, NULL_HANDLE);
}
- MonoReflectionProperty *result = mono_property_get_object_checked (mono_domain_get (), klass, handle, &error);
- mono_error_set_pending_exception (&error);
- return result;
+ return mono_property_get_object_handle (mono_domain_get (), klass, handle, error);
}
-ICALL_EXPORT MonoArray*
-ves_icall_System_Reflection_FieldInfo_GetTypeModifiers (MonoReflectionField *field, MonoBoolean optional)
+ICALL_EXPORT MonoArrayHandle
+ves_icall_System_Reflection_FieldInfo_GetTypeModifiers (MonoReflectionFieldHandle field_h, MonoBoolean optional, MonoError *error)
{
- MonoError error;
- MonoType *type = mono_field_get_type_checked (field->field, &error);
- MonoArray *res;
+ mono_error_init (error);
+ MonoClassField *field = MONO_HANDLE_GETVAL (field_h, field);
- if (!mono_error_ok (&error)) {
- mono_error_set_pending_exception (&error);
- return NULL;
- }
+ MonoType *type = mono_field_get_type_checked (field, error);
+ if (!is_ok (error))
+ return MONO_HANDLE_CAST (MonoArray, NULL_HANDLE);
- res = type_array_from_modifiers (field->field->parent->image, type, optional, &error);
- mono_error_set_pending_exception (&error);
- return res;
+ return type_array_from_modifiers (field->parent->image, type, optional, error);
}
ICALL_EXPORT int
info->callconv |= (sig->hasthis << 5) | (sig->explicit_this << 6);
}
-ICALL_EXPORT MonoArray*
-ves_icall_get_parameter_info (MonoMethod *method, MonoReflectionMethod *member)
+ICALL_EXPORT MonoArrayHandle
+ves_icall_System_Reflection_MonoMethodInfo_get_parameter_info (MonoMethod *method, MonoReflectionMethodHandle member, MonoError *error)
{
- MonoError error;
+ mono_error_init (error);
MonoDomain *domain = mono_domain_get ();
- MonoArray *result = mono_param_get_objects_internal (domain, method, member->reftype ? mono_class_from_mono_type (member->reftype->type) : NULL, &error);
- mono_error_set_pending_exception (&error);
- return result;
+ MonoReflectionTypeHandle reftype = MONO_HANDLE_NEW (MonoReflectionType, NULL);
+ MONO_HANDLE_GET (reftype, member, reftype);
+ MonoClass *klass = NULL;
+ if (!MONO_HANDLE_IS_NULL (reftype))
+ klass = mono_class_from_mono_type (MONO_HANDLE_GETVAL (reftype, type));
+ return mono_param_get_objects_internal (domain, method, klass, error);
}
-ICALL_EXPORT MonoReflectionMarshalAsAttribute*
-ves_icall_System_MonoMethodInfo_get_retval_marshal (MonoMethod *method)
+ICALL_EXPORT MonoReflectionMarshalAsAttributeHandle
+ves_icall_System_MonoMethodInfo_get_retval_marshal (MonoMethod *method, MonoError *error)
{
- MonoError error;
+ mono_error_init (error);
MonoDomain *domain = mono_domain_get ();
- MonoReflectionMarshalAsAttribute* res = NULL;
- MonoMarshalSpec **mspecs;
- int i;
+ MonoReflectionMarshalAsAttributeHandle res = MONO_HANDLE_NEW (MonoReflectionMarshalAsAttribute, NULL);
- mspecs = g_new (MonoMarshalSpec*, mono_method_signature (method)->param_count + 1);
+ MonoMarshalSpec **mspecs = g_new (MonoMarshalSpec*, mono_method_signature (method)->param_count + 1);
mono_method_get_marshal_info (method, mspecs);
if (mspecs [0]) {
- res = mono_reflection_marshal_as_attribute_from_marshal_spec (domain, method->klass, mspecs [0], &error);
- if (!mono_error_ok (&error)) {
- mono_error_set_pending_exception (&error);
- return NULL;
- }
+ MONO_HANDLE_ASSIGN (res, mono_reflection_marshal_as_attribute_from_marshal_spec (domain, method->klass, mspecs [0], error));
+ if (!is_ok (error))
+ goto leave;
}
- for (i = mono_method_signature (method)->param_count; i >= 0; i--)
+leave:
+ for (int i = mono_method_signature (method)->param_count; i >= 0; i--)
if (mspecs [i])
mono_metadata_free_marshal_spec (mspecs [i]);
g_free (mspecs);
ves_icall_MonoField_GetFieldOffset (MonoReflectionField *field)
{
MonoClass *parent = field->field->parent;
- if (!parent->size_inited)
- mono_class_init (parent);
- mono_class_setup_fields_locking (parent);
+ mono_class_setup_fields (parent);
return field->field->offset - sizeof (MonoObject);
}
-ICALL_EXPORT MonoReflectionType*
-ves_icall_MonoField_GetParentType (MonoReflectionField *field, MonoBoolean declaring)
+ICALL_EXPORT MonoReflectionTypeHandle
+ves_icall_MonoField_GetParentType (MonoReflectionFieldHandle field, MonoBoolean declaring, MonoError *error)
{
- MonoError error;
- MonoReflectionType *ret;
+ mono_error_init (error);
+ MonoDomain *domain = MONO_HANDLE_DOMAIN (field);
MonoClass *parent;
- parent = declaring? field->field->parent: field->klass;
-
- ret = mono_type_get_object_checked (mono_object_domain (field), &parent->byval_arg, &error);
- mono_error_set_pending_exception (&error);
-
- return ret;
+ if (declaring) {
+ MonoClassField *f = MONO_HANDLE_GETVAL (field, field);
+ parent = f->parent;
+ } else {
+ parent = MONO_HANDLE_GETVAL (field, klass);
+ }
+ return mono_type_get_object_handle (domain, &parent->byval_arg, error);
}
ICALL_EXPORT MonoObject *
if (image_is_dynamic (field->parent->image)) {
MonoClass *klass = field->parent;
int fidx = field - klass->fields;
+ MonoFieldDefaultValue *def_values = mono_class_get_field_def_values (klass);
+
+ g_assert (def_values);
+ def_type = def_values [fidx].def_type;
+ def_value = def_values [fidx].data;
- 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_set_pending_exception (mono_get_exception_invalid_operation (NULL));
return NULL;
return o;
}
-ICALL_EXPORT MonoReflectionType*
-ves_icall_MonoField_ResolveType (MonoReflectionField *ref_field)
+ICALL_EXPORT MonoReflectionTypeHandle
+ves_icall_MonoField_ResolveType (MonoReflectionFieldHandle ref_field, MonoError *error)
{
- MonoError error;
- MonoReflectionType *ret;
- MonoType *type;
-
- type = mono_field_get_type_checked (ref_field->field, &error);
- if (!mono_error_ok (&error)) {
- mono_error_set_pending_exception (&error);
- return NULL;
- }
-
- ret = mono_type_get_object_checked (mono_object_domain (ref_field), type, &error);
- if (!mono_error_ok (&error)) {
- mono_error_set_pending_exception (&error);
- return NULL;
+ mono_error_init (error);
+ MonoDomain *domain = MONO_HANDLE_DOMAIN (ref_field);
+ MonoClassField *field = MONO_HANDLE_GETVAL (ref_field, field);
+ MonoType *type = mono_field_get_type_checked (field, error);
+ if (!is_ok (error)) {
+ return MONO_HANDLE_CAST (MonoReflectionType, NULL_HANDLE);
}
-
- return ret;
+ return mono_type_get_object_handle (domain, type, error);
}
/* From MonoProperty.cs */
if (!mono_error_ok (data->error))
return;
- if (data->context && ic->generic_class && ic->generic_class->context.class_inst->is_open) {
+ if (data->context && mono_class_is_ginst (ic) && mono_class_get_generic_class (ic)->context.class_inst->is_open) {
inflated = ret = mono_class_inflate_generic_type_checked (ret, data->context, data->error);
if (!mono_error_ok (data->error))
return;
GHashTable *iface_hash = g_hash_table_new (get_interfaces_hash, NULL);
- if (klass->generic_class && klass->generic_class->context.class_inst->is_open) {
+ if (mono_class_is_ginst (klass) && mono_class_get_generic_class (klass)->context.class_inst->is_open) {
data.context = mono_class_get_context (klass);
- klass = klass->generic_class->container_class;
+ klass = mono_class_get_generic_class (klass)->container_class;
}
for (parent = klass; parent; parent = parent->parent) {
}
}
-ICALL_EXPORT MonoReflectionType*
-ves_icall_RuntimeTypeHandle_GetElementType (MonoReflectionType *type)
+ICALL_EXPORT MonoReflectionTypeHandle
+ves_icall_RuntimeTypeHandle_GetElementType (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- MonoError error;
- MonoReflectionType *ret;
- MonoClass *klass;
+ mono_error_init (error);
- if (!type->type->byref && type->type->type == MONO_TYPE_SZARRAY) {
- ret = mono_type_get_object_checked (mono_object_domain (type), &type->type->data.klass->byval_arg, &error);
- mono_error_set_pending_exception (&error);
- return ret;
- }
+ MonoDomain *domain = MONO_HANDLE_DOMAIN (ref_type);
+ MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
- klass = mono_class_from_mono_type (type->type);
- mono_class_init_checked (klass, &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
+ if (!type->byref && type->type == MONO_TYPE_SZARRAY) {
+ return mono_type_get_object_handle (domain, &type->data.klass->byval_arg, error);
+ }
+ MonoClass *klass = mono_class_from_mono_type (type);
+ mono_class_init_checked (klass, error);
+ if (!is_ok (error))
+ return MONO_HANDLE_CAST (MonoReflectionType, NULL_HANDLE);
// GetElementType should only return a type for:
// Array Pointer PassedByRef
- if (type->type->byref)
- ret = mono_type_get_object_checked (mono_object_domain (type), &klass->byval_arg, &error);
+ if (type->byref)
+ return mono_type_get_object_handle (domain, &klass->byval_arg, error);
else if (klass->element_class && MONO_CLASS_IS_ARRAY (klass))
- ret = mono_type_get_object_checked (mono_object_domain (type), &klass->element_class->byval_arg, &error);
- else if (klass->element_class && type->type->type == MONO_TYPE_PTR)
- ret = mono_type_get_object_checked (mono_object_domain (type), &klass->element_class->byval_arg, &error);
+ return mono_type_get_object_handle (domain, &klass->element_class->byval_arg, error);
+ else if (klass->element_class && type->type == MONO_TYPE_PTR)
+ return mono_type_get_object_handle (domain, &klass->element_class->byval_arg, error);
else
- return NULL;
-
- mono_error_set_pending_exception (&error);
-
- return ret;
+ return MONO_HANDLE_CAST (MonoReflectionType, NULL_HANDLE);
}
-ICALL_EXPORT MonoReflectionType*
-ves_icall_RuntimeTypeHandle_GetBaseType (MonoReflectionType *type)
+ICALL_EXPORT MonoReflectionTypeHandle
+ves_icall_RuntimeTypeHandle_GetBaseType (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- MonoError error;
- MonoReflectionType *ret;
+ mono_error_init (error);
- if (type->type->byref)
- return NULL;
+ MonoDomain *domain = MONO_HANDLE_DOMAIN (ref_type);
+ MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
- MonoClass *klass = mono_class_from_mono_type (type->type);
- if (!klass->parent)
- return NULL;
+ if (type->byref)
+ return MONO_HANDLE_CAST (MonoReflectionType, NULL_HANDLE);
- ret = mono_type_get_object_checked (mono_object_domain (type), &klass->parent->byval_arg, &error);
- mono_error_set_pending_exception (&error);
+ MonoClass *klass = mono_class_from_mono_type (type);
+ if (!klass->parent)
+ return MONO_HANDLE_CAST (MonoReflectionType, NULL_HANDLE);
- return ret;
+ return mono_type_get_object_handle (domain, &klass->parent->byval_arg, error);
}
ICALL_EXPORT MonoBoolean
-ves_icall_RuntimeTypeHandle_IsPointer (MonoReflectionType *type)
+ves_icall_RuntimeTypeHandle_IsPointer (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- return type->type->type == MONO_TYPE_PTR;
+ mono_error_init (error);
+ MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
+ return type->type == MONO_TYPE_PTR;
}
ICALL_EXPORT MonoBoolean
-ves_icall_RuntimeTypeHandle_IsPrimitive (MonoReflectionType *type)
+ves_icall_RuntimeTypeHandle_IsPrimitive (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- 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)));
+ mono_error_init (error);
+ MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
+ return (!type->byref && (((type->type >= MONO_TYPE_BOOLEAN) && (type->type <= MONO_TYPE_R8)) || (type->type == MONO_TYPE_I) || (type->type == MONO_TYPE_U)));
}
ICALL_EXPORT MonoBoolean
-ves_icall_RuntimeTypeHandle_IsByRef (MonoReflectionType *type)
+ves_icall_RuntimeTypeHandle_IsByRef (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- return type->type->byref;
+ mono_error_init (error);
+ MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
+ return type->byref;
}
ICALL_EXPORT MonoBoolean
-ves_icall_RuntimeTypeHandle_IsComObject (MonoReflectionType *type)
+ves_icall_RuntimeTypeHandle_IsComObject (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- MonoError error;
- MonoClass *klass = mono_class_from_mono_type (type->type);
- mono_class_init_checked (klass, &error);
- if (mono_error_set_pending_exception (&error))
+ mono_error_init (error);
+ MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
+ MonoClass *klass = mono_class_from_mono_type (type);
+ mono_class_init_checked (klass, error);
+ if (!is_ok (error))
return FALSE;
return mono_class_is_com_object (klass);
}
ICALL_EXPORT guint32
-ves_icall_reflection_get_token (MonoObject* obj)
+ves_icall_reflection_get_token (MonoObjectHandle obj, MonoError *error)
{
- MonoError error;
- guint32 result = mono_reflection_get_token_checked (obj, &error);
- mono_error_set_pending_exception (&error);
- return result;
+ mono_error_init (error);
+ return mono_reflection_get_token_checked (obj, error);
}
-ICALL_EXPORT MonoReflectionModule*
-ves_icall_RuntimeTypeHandle_GetModule (MonoReflectionType *type)
+ICALL_EXPORT MonoReflectionModuleHandle
+ves_icall_RuntimeTypeHandle_GetModule (MonoReflectionTypeHandle type, MonoError *error)
{
- MonoError error;
- MonoReflectionModule *result = NULL;
- MonoClass *klass = mono_class_from_mono_type (type->type);
- result = mono_module_get_object_checked (mono_object_domain (type), klass->image, &error);
- mono_error_set_pending_exception (&error);
- return result;
+ mono_error_init (error);
+ MonoDomain *domain = MONO_HANDLE_DOMAIN (type);
+ MonoType *t = MONO_HANDLE_GETVAL (type, type);
+ MonoClass *klass = mono_class_from_mono_type (t);
+ return mono_module_get_object_handle (domain, klass->image, error);
}
-ICALL_EXPORT MonoReflectionAssembly*
-ves_icall_RuntimeTypeHandle_GetAssembly (MonoReflectionType *type)
+ICALL_EXPORT MonoReflectionAssemblyHandle
+ves_icall_RuntimeTypeHandle_GetAssembly (MonoReflectionTypeHandle type, MonoError *error)
{
- MonoError error;
+ mono_error_init (error);
MonoDomain *domain = mono_domain_get ();
- MonoClass *klass = mono_class_from_mono_type (type->type);
- MonoReflectionAssembly *result = mono_assembly_get_object_checked (domain, klass->image->assembly, &error);
- mono_error_set_pending_exception (&error);
- return result;
+ MonoType *t = MONO_HANDLE_GETVAL (type, type);
+ MonoClass *klass = mono_class_from_mono_type (t);
+ return mono_assembly_get_object_handle (domain, klass->image->assembly, error);
}
ICALL_EXPORT MonoReflectionType*
}
ICALL_EXPORT gint32
-ves_icall_RuntimeTypeHandle_GetArrayRank (MonoReflectionType *type)
+ves_icall_RuntimeTypeHandle_GetArrayRank (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- MonoClass *klass;
+ mono_error_init (error);
+ MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
- if (type->type->type != MONO_TYPE_ARRAY && type->type->type != MONO_TYPE_SZARRAY) {
- mono_set_pending_exception (mono_get_exception_argument ("type", "Type must be an array type"));
+ if (type->type != MONO_TYPE_ARRAY && type->type != MONO_TYPE_SZARRAY) {
+ mono_error_set_argument (error, "type", "Type must be an array type");
return 0;
}
- klass = mono_class_from_mono_type (type->type);
+ MonoClass *klass = mono_class_from_mono_type (type);
return klass->rank;
}
klass = mono_class_from_mono_type (type->type);
- if (klass->generic_container) {
- MonoGenericContainer *container = klass->generic_container;
+ if (mono_class_is_gtd (klass)) {
+ MonoGenericContainer *container = mono_class_get_generic_container (klass);
res = create_type_array (domain, runtimeTypeArray, container->type_argc, &error);
if (mono_error_set_pending_exception (&error))
return NULL;
mono_array_setref (res, i, rt);
}
- } else if (klass->generic_class) {
- MonoGenericInst *inst = klass->generic_class->context.class_inst;
+ } else if (mono_class_is_ginst (klass)) {
+ MonoGenericInst *inst = mono_class_get_generic_class (klass)->context.class_inst;
res = create_type_array (domain, runtimeTypeArray, inst->type_argc, &error);
if (mono_error_set_pending_exception (&error))
return NULL;
}
ICALL_EXPORT gboolean
-ves_icall_RuntimeTypeHandle_IsGenericTypeDefinition (MonoReflectionType *type)
+ves_icall_RuntimeTypeHandle_IsGenericTypeDefinition (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- MonoClass *klass;
+ mono_error_init (error);
- if (!IS_MONOTYPE (type))
+ if (!IS_MONOTYPE (MONO_HANDLE_RAW(ref_type)))
return FALSE;
- if (type->type->byref)
+ MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
+ if (type->byref)
return FALSE;
- klass = mono_class_from_mono_type (type->type);
- return klass->generic_container != NULL;
+ MonoClass *klass = mono_class_from_mono_type (type);
+ return mono_class_is_gtd (klass);
}
-ICALL_EXPORT MonoReflectionType*
-ves_icall_RuntimeTypeHandle_GetGenericTypeDefinition_impl (MonoReflectionType *type)
+ICALL_EXPORT MonoReflectionTypeHandle
+ves_icall_RuntimeTypeHandle_GetGenericTypeDefinition_impl (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- MonoError error;
- MonoReflectionType *ret;
- MonoClass *klass;
-
- if (type->type->byref)
- return NULL;
+ mono_error_init (error);
+ MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
- klass = mono_class_from_mono_type (type->type);
+ MonoReflectionTypeHandle ret = MONO_HANDLE_NEW (MonoReflectionType, NULL);
- if (klass->generic_container) {
- return type; /* check this one */
- }
- if (klass->generic_class) {
- MonoClass *generic_class = klass->generic_class->container_class;
- gpointer tb;
+ if (type->byref)
+ goto leave;
- tb = mono_class_get_ref_info (generic_class);
+ MonoClass *klass = mono_class_from_mono_type (type);
- if (generic_class->wastypebuilder && tb)
- return (MonoReflectionType *)tb;
- else {
- ret = mono_type_get_object_checked (mono_object_domain (type), &generic_class->byval_arg, &error);
- mono_error_set_pending_exception (&error);
+ if (mono_class_is_gtd (klass)) {
+ /* check this one */
+ MONO_HANDLE_ASSIGN (ret, ref_type);
+ goto leave;
+ }
+ if (mono_class_is_ginst (klass)) {
+ MonoClass *generic_class = mono_class_get_generic_class (klass)->container_class;
- return ret;
+ guint32 ref_info_handle = mono_class_get_ref_info_handle (klass);
+
+ if (generic_class->wastypebuilder && ref_info_handle) {
+ MonoObjectHandle tb = mono_gchandle_get_target_handle (ref_info_handle);
+ g_assert (!MONO_HANDLE_IS_NULL (tb));
+ MONO_HANDLE_ASSIGN (ret, tb);
+ } else {
+ MonoDomain *domain = MONO_HANDLE_DOMAIN (ref_type);
+ MONO_HANDLE_ASSIGN (ret, mono_type_get_object_handle (domain, &generic_class->byval_arg, error));
}
}
- return NULL;
+leave:
+ return ret;
}
ICALL_EXPORT MonoReflectionType*
klass = mono_class_from_mono_type (geninst);
/*we might inflate to the GTD*/
- if (klass->generic_class && !mono_verifier_class_is_valid_generic_instantiation (klass)) {
+ if (mono_class_is_ginst (klass) && !mono_verifier_class_is_valid_generic_instantiation (klass)) {
mono_set_pending_exception (mono_get_exception_argument ("typeArguments", "Invalid generic arguments"));
return NULL;
}
}
ICALL_EXPORT gboolean
-ves_icall_RuntimeTypeHandle_HasInstantiation (MonoReflectionType *type)
+ves_icall_RuntimeTypeHandle_HasInstantiation (MonoReflectionTypeHandle ref_type, MonoError *error)
{
+ mono_error_init (error);
MonoClass *klass;
- if (!IS_MONOTYPE (type))
+ if (!IS_MONOTYPE (MONO_HANDLE_RAW (ref_type)))
return FALSE;
- if (type->type->byref)
+ MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
+ if (type->byref)
return FALSE;
- klass = mono_class_from_mono_type (type->type);
- return klass->generic_class != NULL || klass->generic_container != NULL;
+ klass = mono_class_from_mono_type (type);
+ return mono_class_is_ginst (klass) || mono_class_is_gtd (klass);
}
ICALL_EXPORT gint32
}
ICALL_EXPORT MonoGenericParamInfo *
-ves_icall_RuntimeTypeHandle_GetGenericParameterInfo (MonoReflectionType *type)
+ves_icall_RuntimeTypeHandle_GetGenericParameterInfo (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- return mono_generic_param_info (type->type->data.generic_param);
+ mono_error_init (error);
+ MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
+ return mono_generic_param_info (type->data.generic_param);
}
ICALL_EXPORT MonoBoolean
-ves_icall_RuntimeTypeHandle_IsGenericVariable (MonoReflectionType *type)
+ves_icall_RuntimeTypeHandle_IsGenericVariable (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- return is_generic_parameter (type->type);
+ mono_error_init (error);
+ MonoType *type = MONO_HANDLE_GETVAL(ref_type, type);
+ return is_generic_parameter (type);
}
ICALL_EXPORT MonoReflectionMethod*
return NULL;
}
- if ((m->klass->flags & TYPE_ATTRIBUTE_ABSTRACT) && !strcmp (m->name, ".ctor") && !this_arg) {
+ if (mono_class_is_abstract (m->klass) && !strcmp (m->name, ".ctor") && !this_arg) {
mono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_exception_from_name_msg (mono_defaults.corlib, "System.Reflection", "TargetException", "Cannot invoke constructor of an abstract class."));
return NULL;
}
return 0;
}
+static void
+get_enum_field (MonoDomain *domain, MonoArrayHandle names, MonoArrayHandle values, int base_type, MonoClassField *field, guint* j, guint64 *previous_value, gboolean *sorted, MonoError *error)
+{
+ mono_error_init (error);
+ HANDLE_FUNCTION_ENTER();
+ guint64 field_value;
+ const char *p;
+ MonoTypeEnum def_type;
+
+ if (!(field->type->attrs & FIELD_ATTRIBUTE_STATIC))
+ goto leave;
+ if (strcmp ("value__", mono_field_get_name (field)) == 0)
+ goto leave;
+ if (mono_field_is_deleted (field))
+ goto leave;
+ MonoStringHandle name = mono_string_new_handle (domain, mono_field_get_name (field), error);
+ if (!is_ok (error))
+ goto leave;
+ MONO_HANDLE_ARRAY_SETREF (names, *j, name);
+
+ p = mono_class_get_field_default_value (field, &def_type);
+ /* len = */ mono_metadata_decode_blob_size (p, &p);
+
+ field_value = read_enum_value (p, base_type);
+ MONO_HANDLE_ARRAY_SETVAL (values, guint64, *j, field_value);
+
+ if (*previous_value > field_value)
+ *sorted = FALSE;
+
+ *previous_value = field_value;
+ (*j)++;
+leave:
+ HANDLE_FUNCTION_RETURN();
+}
+
ICALL_EXPORT MonoBoolean
-ves_icall_System_Enum_GetEnumValuesAndNames (MonoReflectionType *type, MonoArray **values, MonoArray **names)
+ves_icall_System_Enum_GetEnumValuesAndNames (MonoReflectionTypeHandle type, MonoArrayHandleOut values, MonoArrayHandleOut names, MonoError *error)
{
- MonoError error;
- MonoDomain *domain = mono_object_domain (type);
- MonoClass *enumc = mono_class_from_mono_type (type->type);
+ MonoDomain *domain = MONO_HANDLE_DOMAIN (type);
+ MonoClass *enumc = mono_class_from_mono_type (MONO_HANDLE_RAW(type)->type);
guint j = 0, nvalues;
gpointer iter;
MonoClassField *field;
int base_type;
- guint64 field_value, previous_value = 0;
+ guint64 previous_value = 0;
gboolean sorted = TRUE;
- mono_class_init_checked (enumc, &error);
- if (mono_error_set_pending_exception (&error))
- return FALSE;
-
+ mono_error_init (error);
+ mono_class_init_checked (enumc, error);
+ return_val_if_nok (error, FALSE);
if (!enumc->enumtype) {
- mono_set_pending_exception (mono_get_exception_argument ("enumType", "Type provided must be an Enum."));
+ mono_error_set_argument (error, "enumType", "Type provided must be an Enum.");
return TRUE;
}
base_type = mono_class_enum_basetype (enumc)->type;
- nvalues = mono_class_num_fields (enumc) ? mono_class_num_fields (enumc) - 1 : 0;
- *names = mono_array_new_checked (domain, mono_defaults.string_class, nvalues, &error);
- if (mono_error_set_pending_exception (&error))
- return FALSE;
- *values = mono_array_new_checked (domain, mono_defaults.uint64_class, nvalues, &error);
- if (mono_error_set_pending_exception (&error))
- return FALSE;
+ nvalues = mono_class_num_fields (enumc) > 0 ? mono_class_num_fields (enumc) - 1 : 0;
+ MONO_HANDLE_ASSIGN(names, mono_array_new_handle (domain, mono_defaults.string_class, nvalues, error));
+ return_val_if_nok (error, FALSE);
+ MONO_HANDLE_ASSIGN(values, mono_array_new_handle (domain, mono_defaults.uint64_class, nvalues, error));
+ return_val_if_nok (error, FALSE);
iter = NULL;
while ((field = mono_class_get_fields (enumc, &iter))) {
- const char *p;
- MonoTypeEnum def_type;
-
- if (!(field->type->attrs & FIELD_ATTRIBUTE_STATIC))
- continue;
- if (strcmp ("value__", mono_field_get_name (field)) == 0)
- continue;
- if (mono_field_is_deleted (field))
- continue;
- mono_array_setref (*names, j, mono_string_new (domain, mono_field_get_name (field)));
-
- p = mono_class_get_field_default_value (field, &def_type);
- /* len = */ mono_metadata_decode_blob_size (p, &p);
-
- field_value = read_enum_value (p, base_type);
- mono_array_set (*values, guint64, j, field_value);
-
- if (previous_value > field_value)
- sorted = FALSE;
-
- previous_value = field_value;
- ++j;
+ get_enum_field(domain, names, values, base_type, field, &j, &previous_value, &sorted, error);
+ if (!is_ok (error))
+ break;
}
+ return_val_if_nok (error, FALSE);
return sorted;
}
* nested types that aren't generic. In any case, the container of that
* nested type would be the generic type definition.
*/
- if (klass->generic_class)
- klass = klass->generic_class->container_class;
+ if (mono_class_is_ginst (klass))
+ klass = mono_class_get_generic_class (klass)->container_class;
res_array = g_ptr_array_new ();
iter = NULL;
while ((nested = mono_class_get_nested_types (klass, &iter))) {
match = 0;
- if ((nested->flags & TYPE_ATTRIBUTE_VISIBILITY_MASK) == TYPE_ATTRIBUTE_NESTED_PUBLIC) {
+ if ((mono_class_get_flags (nested) & TYPE_ATTRIBUTE_VISIBILITY_MASK) == TYPE_ATTRIBUTE_NESTED_PUBLIC) {
if (bflags & BFLAGS_Public)
match++;
} else {
return res_array;
}
-ICALL_EXPORT MonoReflectionType*
-ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *assembly, MonoReflectionModule *module, MonoString *name, MonoBoolean throwOnError, MonoBoolean ignoreCase)
+static MonoType*
+get_type_from_module_builder_module (MonoArrayHandle modules, int i, MonoTypeNameParse *info, MonoBoolean ignoreCase, gboolean *type_resolve, MonoError *error)
{
- MonoError error;
- MonoReflectionType *ret;
- gchar *str;
+ HANDLE_FUNCTION_ENTER ();
+ mono_error_init (error);
MonoType *type = NULL;
+ MonoReflectionModuleBuilderHandle mb = MONO_HANDLE_NEW (MonoReflectionModuleBuilder, NULL);
+ MONO_HANDLE_ARRAY_GETREF (mb, modules, i);
+ MonoDynamicImage *dynamic_image = MONO_HANDLE_GETVAL (mb, dynamic_image);
+ type = mono_reflection_get_type_checked (&dynamic_image->image, &dynamic_image->image, info, ignoreCase, type_resolve, error);
+ HANDLE_FUNCTION_RETURN_VAL (type);
+}
+
+static MonoType*
+get_type_from_module_builder_loaded_modules (MonoArrayHandle loaded_modules, int i, MonoTypeNameParse *info, MonoBoolean ignoreCase, gboolean *type_resolve, MonoError *error)
+{
+ HANDLE_FUNCTION_ENTER ();
+ mono_error_init (error);
+ MonoType *type = NULL;
+ MonoReflectionModuleHandle mod = MONO_HANDLE_NEW (MonoReflectionModule, NULL);
+ MONO_HANDLE_ARRAY_GETREF (mod, loaded_modules, i);
+ MonoImage *image = MONO_HANDLE_GETVAL (mod, image);
+ type = mono_reflection_get_type_checked (image, image, info, ignoreCase, type_resolve, error);
+ HANDLE_FUNCTION_RETURN_VAL (type);
+}
+
+ICALL_EXPORT MonoReflectionTypeHandle
+ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssemblyHandle assembly_h, MonoReflectionModuleHandle module, MonoStringHandle name, MonoBoolean throwOnError, MonoBoolean ignoreCase, MonoError *error)
+{
+ mono_error_init (error);
+
MonoTypeNameParse info;
gboolean type_resolve;
/* On MS.NET, this does not fire a TypeResolve event */
type_resolve = TRUE;
- str = mono_string_to_utf8_checked (name, &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
+ char *str = mono_string_handle_to_utf8 (name, error);
+ if (!is_ok (error))
+ goto fail;
+
/*g_print ("requested type %s in %s\n", str, assembly->assembly->aname.name);*/
if (!mono_reflection_parse_type (str, &info)) {
g_free (str);
mono_reflection_free_type_info (&info);
if (throwOnError) {
- mono_set_pending_exception (mono_get_exception_argument("name", "failed parse"));
- return NULL;
+ mono_error_set_argument (error, "name", "failed to parse the type");
+ goto fail;
}
/*g_print ("failed parse\n");*/
- return NULL;
+ return MONO_HANDLE_CAST (MonoReflectionType, NULL_HANDLE);
}
if (info.assembly.name) {
if (throwOnError) {
/* 1.0 and 2.0 throw different exceptions */
if (mono_defaults.generic_ilist_class)
- mono_set_pending_exception (mono_get_exception_argument (NULL, "Type names passed to Assembly.GetType() must not specify an assembly."));
+ mono_error_set_argument (error, NULL, "Type names passed to Assembly.GetType() must not specify an assembly.");
else
- mono_set_pending_exception (mono_get_exception_type_load (name, NULL));
- return NULL;
+ mono_error_set_type_load_name (error, g_strdup (""), g_strdup (""), "Type names passed to Assembly.GetType() must not specify an assembly.");
+ goto fail;
}
- return NULL;
+ return MONO_HANDLE_CAST (MonoReflectionType, NULL_HANDLE);
}
- if (module != NULL) {
- if (module->image) {
- type = mono_reflection_get_type_checked (module->image, module->image, &info, ignoreCase, &type_resolve, &error);
- if (!is_ok (&error)) {
+ MonoType *type = NULL;
+ if (!MONO_HANDLE_IS_NULL (module)) {
+ MonoImage *image = MONO_HANDLE_GETVAL (module, image);
+ if (image) {
+ type = mono_reflection_get_type_checked (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;
+ goto fail;
}
- } else
- type = NULL;
+ }
}
- else
- if (assembly_is_dynamic (assembly->assembly)) {
+ else {
+ MonoAssembly *assembly = MONO_HANDLE_GETVAL (assembly_h, assembly);
+ if (assembly_is_dynamic (assembly)) {
/* Enumerate all modules */
- MonoReflectionAssemblyBuilder *abuilder = (MonoReflectionAssemblyBuilder*)assembly;
+ MonoReflectionAssemblyBuilderHandle abuilder = MONO_HANDLE_NEW (MonoReflectionAssemblyBuilder, NULL);
+ MONO_HANDLE_ASSIGN (abuilder, assembly_h);
int i;
- type = NULL;
- 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_checked (&mb->dynamic_image->image, &mb->dynamic_image->image, &info, ignoreCase, &type_resolve, &error);
- if (!is_ok (&error)) {
+ MonoArrayHandle modules = MONO_HANDLE_NEW (MonoArray, NULL);
+ MONO_HANDLE_GET (modules, abuilder, modules);
+ if (!MONO_HANDLE_IS_NULL (modules)) {
+ int n = mono_array_handle_length (modules);
+ for (i = 0; i < n; ++i) {
+ type = get_type_from_module_builder_module (modules, i, &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;
+ goto fail;
}
if (type)
break;
}
}
- 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_checked (mod->image, mod->image, &info, ignoreCase, &type_resolve, &error);
- if (!is_ok (&error)) {
+ MonoArrayHandle loaded_modules = MONO_HANDLE_NEW (MonoArray, NULL);
+ MONO_HANDLE_GET (loaded_modules, abuilder, loaded_modules);
+ if (!type && !MONO_HANDLE_IS_NULL (loaded_modules)) {
+ int n = mono_array_handle_length (loaded_modules);
+ for (i = 0; i < n; ++i) {
+ type = get_type_from_module_builder_loaded_modules (loaded_modules, i, &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;
+ goto fail;
}
if (type)
break;
}
}
else {
- type = mono_reflection_get_type_checked (assembly->assembly->image, assembly->assembly->image, &info, ignoreCase, &type_resolve, &error);
- if (!is_ok (&error)) {
+ type = mono_reflection_get_type_checked (assembly->image, 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;
+ goto fail;
}
}
+ }
g_free (str);
mono_reflection_free_type_info (&info);
+
if (!type) {
- MonoException *e = NULL;
-
- if (throwOnError)
- e = mono_get_exception_type_load (name, NULL);
+ if (throwOnError) {
+ MonoError inner_error;
+ char *typename = mono_string_handle_to_utf8 (name, &inner_error);
+ mono_error_assert_ok (&inner_error);
+ MonoAssembly *assembly = MONO_HANDLE_GETVAL (assembly_h, assembly);
+ char *assmname = mono_stringify_assembly_name (&assembly->aname);
+ mono_error_set_type_load_name (error, typename, assmname, "%s", "");
+ goto fail;
+ }
- if (e != NULL)
- mono_set_pending_exception (e);
- return NULL;
+ return MONO_HANDLE_CAST (MonoReflectionType, NULL_HANDLE);
}
if (type->type == MONO_TYPE_CLASS) {
/* need to report exceptions ? */
if (throwOnError && mono_class_has_failure (klass)) {
/* report SecurityException (or others) that occured when loading the assembly */
- mono_error_set_for_class_failure (&error, klass);
- mono_error_set_pending_exception (&error);
- return NULL;
+ mono_error_set_for_class_failure (error, klass);
+ goto fail;
}
}
/* g_print ("got it\n"); */
- ret = mono_type_get_object_checked (mono_object_domain (assembly), type, &error);
- mono_error_set_pending_exception (&error);
-
- return ret;
+ return mono_type_get_object_handle (MONO_HANDLE_DOMAIN (assembly_h), type, error);
+fail:
+ g_assert (!is_ok (error));
+ return MONO_HANDLE_CAST (MonoReflectionType, NULL_HANDLE);
}
static gboolean
return FALSE;
}
-ICALL_EXPORT MonoString *
-ves_icall_System_Reflection_Assembly_get_code_base (MonoReflectionAssembly *assembly, MonoBoolean escaped)
+ICALL_EXPORT MonoStringHandle
+ves_icall_System_Reflection_Assembly_get_code_base (MonoReflectionAssemblyHandle assembly, MonoBoolean escaped, MonoError *error)
{
- MonoDomain *domain = mono_object_domain (assembly);
- MonoAssembly *mass = assembly->assembly;
- MonoString *res = NULL;
- gchar *uri;
+ mono_error_init (error);
+ MonoDomain *domain = MONO_HANDLE_DOMAIN (assembly);
+ MonoAssembly *mass = MONO_HANDLE_GETVAL (assembly, assembly);
gchar *absolute;
gchar *dirname;
mono_icall_make_platform_path (absolute);
+ gchar *uri;
if (escaped) {
uri = g_filename_to_uri (absolute, NULL, NULL);
} else {
uri = g_strconcat (prepend, absolute, NULL);
}
+ g_free (absolute);
+
+ MonoStringHandle res;
if (uri) {
- res = mono_string_new (domain, uri);
+ res = mono_string_new_handle (domain, uri, error);
g_free (uri);
+ } else {
+ res = MONO_HANDLE_NEW (MonoString, NULL);
}
- g_free (absolute);
return res;
}
ICALL_EXPORT MonoBoolean
-ves_icall_System_Reflection_Assembly_get_global_assembly_cache (MonoReflectionAssembly *assembly)
+ves_icall_System_Reflection_Assembly_get_global_assembly_cache (MonoReflectionAssemblyHandle assembly, MonoError *error)
{
- MonoAssembly *mass = assembly->assembly;
+ mono_error_init (error);
+ MonoAssembly *mass = MONO_HANDLE_GETVAL (assembly,assembly);
return mass->in_gac;
}
-ICALL_EXPORT MonoReflectionAssembly*
-ves_icall_System_Reflection_Assembly_load_with_partial_name (MonoString *mname, MonoObject *evidence)
+ICALL_EXPORT MonoReflectionAssemblyHandle
+ves_icall_System_Reflection_Assembly_load_with_partial_name (MonoStringHandle mname, MonoObjectHandle evidence, MonoError *error)
{
- MonoError error;
gchar *name;
- MonoAssembly *res;
MonoImageOpenStatus status;
- MonoReflectionAssembly* result = NULL;
+ MonoReflectionAssemblyHandle result = MONO_HANDLE_CAST (MonoReflectionAssembly, NULL_HANDLE);
- name = mono_string_to_utf8_checked (mname, &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
- res = mono_assembly_load_with_partial_name (name, &status);
+ name = mono_string_handle_to_utf8 (mname, error);
+ if (!is_ok (error))
+ goto leave;
+ MonoAssembly *res = mono_assembly_load_with_partial_name (name, &status);
g_free (name);
if (res == NULL)
- return NULL;
- result = mono_assembly_get_object_checked (mono_domain_get (), res, &error);
- if (!result)
- mono_error_set_pending_exception (&error);
+ goto leave;
+ result = mono_assembly_get_object_handle (mono_domain_get (), res, error);
+leave:
return result;
}
ves_icall_System_Reflection_Assembly_get_location (MonoReflectionAssemblyHandle refassembly, MonoError *error)
{
MonoDomain *domain = MONO_HANDLE_DOMAIN (refassembly);
- MonoAssembly *assembly = MONO_HANDLE_RAW (refassembly)->assembly;
+ MonoAssembly *assembly = MONO_HANDLE_GETVAL (refassembly, assembly);
return mono_string_new_handle (domain, mono_image_get_filename (assembly->image), error);
}
ICALL_EXPORT MonoBoolean
-ves_icall_System_Reflection_Assembly_get_ReflectionOnly (MonoReflectionAssembly *assembly)
+ves_icall_System_Reflection_Assembly_get_ReflectionOnly (MonoReflectionAssemblyHandle assembly_h, MonoError *error)
{
- return assembly->assembly->ref_only;
+ mono_error_init (error);
+ MonoAssembly *assembly = MONO_HANDLE_GETVAL (assembly_h, assembly);
+ return assembly->ref_only;
}
ICALL_EXPORT MonoStringHandle
ves_icall_System_Reflection_Assembly_InternalImageRuntimeVersion (MonoReflectionAssemblyHandle refassembly, MonoError *error)
{
MonoDomain *domain = MONO_HANDLE_DOMAIN (refassembly);
- MonoAssembly *assembly = MONO_HANDLE_RAW (refassembly)->assembly;
+ MonoAssembly *assembly = MONO_HANDLE_GETVAL (refassembly, assembly);
return mono_string_new_handle (domain, assembly->image->version, error);
}
-ICALL_EXPORT MonoReflectionMethod*
-ves_icall_System_Reflection_Assembly_get_EntryPoint (MonoReflectionAssembly *assembly)
+ICALL_EXPORT MonoReflectionMethodHandle
+ves_icall_System_Reflection_Assembly_get_EntryPoint (MonoReflectionAssemblyHandle assembly_h, MonoError *error)
{
- MonoError error;
- MonoReflectionMethod *res = NULL;
+ mono_error_init (error);
+ MonoDomain *domain = MONO_HANDLE_DOMAIN (assembly_h);
+ MonoAssembly *assembly = MONO_HANDLE_GETVAL (assembly_h, assembly);
MonoMethod *method;
- guint32 token = mono_image_get_entry_point (assembly->assembly->image);
+ MonoReflectionMethodHandle res = MONO_HANDLE_NEW (MonoReflectionMethod, NULL);
+ guint32 token = mono_image_get_entry_point (assembly->image);
if (!token)
- return NULL;
- method = mono_get_method_checked (assembly->assembly->image, token, NULL, NULL, &error);
- if (!mono_error_ok (&error))
+ goto leave;
+ method = mono_get_method_checked (assembly->image, token, NULL, NULL, error);
+ if (!is_ok (error))
goto leave;
- res = mono_method_get_object_checked (mono_object_domain (assembly), method, NULL, &error);
-
+ MONO_HANDLE_ASSIGN (res, mono_method_get_object_handle (domain, method, NULL, error));
leave:
- if (!mono_error_ok (&error))
- mono_error_set_pending_exception (&error);
return res;
}
-ICALL_EXPORT MonoReflectionModule*
-ves_icall_System_Reflection_Assembly_GetManifestModuleInternal (MonoReflectionAssembly *assembly)
+ICALL_EXPORT MonoReflectionModuleHandle
+ves_icall_System_Reflection_Assembly_GetManifestModuleInternal (MonoReflectionAssemblyHandle assembly, MonoError *error)
{
- MonoError error;
- MonoReflectionModule *result = NULL;
- result = mono_module_get_object_checked (mono_object_domain (assembly), assembly->assembly->image, &error);
- if (!mono_error_ok (&error))
- mono_error_set_pending_exception (&error);
- return result;
+ mono_error_init (error);
+ MonoDomain *domain = MONO_HANDLE_DOMAIN (assembly);
+ MonoAssembly *a = MONO_HANDLE_GETVAL (assembly, assembly);
+ return mono_module_get_object_handle (domain, a->image, error);
}
-ICALL_EXPORT MonoArray*
-ves_icall_System_Reflection_Assembly_GetManifestResourceNames (MonoReflectionAssembly *assembly)
+static gboolean
+add_manifest_resource_name_to_array (MonoDomain *domain, MonoImage *image, MonoTableInfo *table, int i, MonoArrayHandle dest, MonoError *error)
{
- MonoError error;
- MonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];
- MonoArray *result = mono_array_new_checked (mono_object_domain (assembly), mono_defaults.string_class, table->rows, &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
+ HANDLE_FUNCTION_ENTER ();
+ mono_error_init (error);
+ const char *val = mono_metadata_string_heap (image, mono_metadata_decode_row_col (table, i, MONO_MANIFEST_NAME));
+ MonoStringHandle str = mono_string_new_handle (domain, val, error);
+ if (!is_ok (error))
+ goto leave;
+ MONO_HANDLE_ARRAY_SETREF (dest, i, str);
+leave:
+ HANDLE_FUNCTION_RETURN_VAL (is_ok (error));
+}
+
+ICALL_EXPORT MonoArrayHandle
+ves_icall_System_Reflection_Assembly_GetManifestResourceNames (MonoReflectionAssemblyHandle assembly_h, MonoError *error)
+{
+ mono_error_init (error);
+ MonoDomain *domain = MONO_HANDLE_DOMAIN (assembly_h);
+ MonoAssembly *assembly = MONO_HANDLE_GETVAL (assembly_h, assembly);
+ MonoTableInfo *table = &assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];
+ MonoArrayHandle result = mono_array_new_handle (domain, mono_defaults.string_class, table->rows, error);
+ if (!is_ok (error))
+ goto fail;
int i;
- const char *val;
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));
+ if (!add_manifest_resource_name_to_array (domain, assembly->image, table, i, result, error))
+ goto fail;
}
return result;
+fail:
+ return MONO_HANDLE_CAST (MonoArray, NULL_HANDLE);
}
ICALL_EXPORT MonoStringHandle
ves_icall_System_Reflection_Assembly_GetAotId (MonoError *error)
{
- int i;
- guint8 aotid_sum = 0;
- MonoDomain* domain = mono_domain_get ();
-
- if (!domain->entry_assembly || !domain->entry_assembly->image)
- return NULL;
-
- guint8 (*aotid)[16] = &domain->entry_assembly->image->aotid;
-
- for (i = 0; i < 16; ++i)
- aotid_sum |= (*aotid)[i];
-
- if (aotid_sum == 0)
+ char *guid = mono_runtime_get_aotid ();
+ if (guid == NULL)
return NULL;
-
- gchar *guid = mono_guid_to_string((guint8*) aotid);
- MonoStringHandle res = mono_string_new_handle (domain, guid, error);
+ MonoStringHandle res = mono_string_new_handle (mono_domain_get (), guid, error);
g_free (guid);
return res;
}
-static MonoObject*
-create_version (MonoDomain *domain, guint32 major, guint32 minor, guint32 build, guint32 revision, MonoError *error)
+static MonoAssemblyName*
+create_referenced_assembly_name (MonoDomain *domain, MonoImage *image, MonoTableInfo *t, int i, MonoError *error)
{
- static MonoMethod *create_version = NULL;
- MonoObject *result;
- gpointer args [4];
-
mono_error_init (error);
-
-
- if (!create_version) {
- MonoMethodDesc *desc = mono_method_desc_new (":.ctor(int,int,int,int)", FALSE);
- create_version = mono_method_desc_search_in_class (desc, mono_class_get_system_version_class ());
- g_assert (create_version);
- mono_method_desc_free (desc);
- }
-
- args [0] = &major;
- args [1] = &minor;
- args [2] = &build;
- args [3] = &revision;
- result = mono_object_new_checked (domain, mono_class_get_system_version_class (), error);
- return_val_if_nok (error, NULL);
-
- mono_runtime_invoke_checked (create_version, result, args, error);
- return_val_if_nok (error, NULL);
-
- return result;
+ MonoAssemblyName *aname = g_new0 (MonoAssemblyName, 1);
+
+ mono_assembly_get_assemblyref (image, i, aname);
+ aname->hash_alg = ASSEMBLY_HASH_SHA1 /* SHA1 (default) */;
+ /* name and culture are pointers into the image tables, but we need
+ * real malloc'd strings (so that we can g_free() them later from
+ * Mono.RuntimeMarshal.FreeAssemblyName) */
+ aname->name = g_strdup (aname->name);
+ aname->culture = g_strdup (aname->culture);
+ /* Don't need the hash value in managed */
+ aname->hash_value = NULL;
+ aname->hash_len = 0;
+ g_assert (aname->public_key == NULL);
+
+ /* 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). */
+ return aname;
}
-ICALL_EXPORT MonoArray*
-ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAssembly *assembly)
+ICALL_EXPORT GPtrArray*
+ves_icall_System_Reflection_Assembly_InternalGetReferencedAssemblies (MonoReflectionAssemblyHandle assembly, MonoError *error)
{
- MonoError error;
- MonoArray *result;
- MonoDomain *domain = mono_object_domain (assembly);
- int i, count = 0;
- static MonoMethod *create_culture = NULL;
- MonoImage *image = assembly->assembly->image;
- MonoTableInfo *t;
- MonoObject *o;
-
- t = &assembly->assembly->image->tables [MONO_TABLE_ASSEMBLYREF];
- count = t->rows;
-
- result = mono_array_new_checked (domain, mono_class_get_assembly_name_class (), count, &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
-
-
- if (count > 0 && !create_culture) {
- MonoMethodDesc *desc = mono_method_desc_new (
- "System.Globalization.CultureInfo:CreateCulture(string,bool)", TRUE);
- create_culture = mono_method_desc_search_in_image (desc, mono_defaults.corlib);
- g_assert (create_culture);
- mono_method_desc_free (desc);
- }
-
- for (i = 0; i < count; i++) {
- MonoObject *version;
- MonoReflectionAssemblyName *aname;
- guint32 cols [MONO_ASSEMBLYREF_SIZE];
-
- mono_metadata_decode_row (t, i, cols, MONO_ASSEMBLYREF_SIZE);
-
- aname = (MonoReflectionAssemblyName *) mono_object_new_checked (
- domain, mono_class_get_assembly_name_class (), &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
-
- MONO_OBJECT_SETREF (aname, name, mono_string_new (domain, mono_metadata_string_heap (image, cols [MONO_ASSEMBLYREF_NAME])));
-
- 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->hashalg = ASSEMBLY_HASH_SHA1; /* SHA1 (default) */
-
- version = create_version (domain, aname->major, aname->minor, aname->build, aname->revision, &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
-
- MONO_OBJECT_SETREF (aname, version, version);
-
- if (create_culture) {
- gpointer args [2];
- MonoBoolean assembly_ref = 1;
- args [0] = mono_string_new (domain, mono_metadata_string_heap (image, cols [MONO_ASSEMBLYREF_CULTURE]));
- args [1] = &assembly_ref;
-
- o = mono_runtime_invoke_checked (create_culture, NULL, args, &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
-
- MONO_OBJECT_SETREF (aname, cultureInfo, o);
- }
-
- 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 */
- MonoArray *pkey = mono_array_new_checked (domain, mono_defaults.byte_class, pkey_len, &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
-
- MONO_OBJECT_SETREF (aname, publicKey, pkey);
- memcpy (mono_array_addr (pkey, guint8, 0), pkey_ptr, pkey_len);
- } else {
- MonoArray *keyToken = mono_array_new_checked (domain, mono_defaults.byte_class, pkey_len, &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
+ mono_error_init (error);
+ MonoDomain *domain = MONO_HANDLE_DOMAIN (assembly);
+ MonoAssembly *ass = MONO_HANDLE_GETVAL(assembly, assembly);
+ MonoImage *image = ass->image;
- MONO_OBJECT_SETREF (aname, keyToken, keyToken);
- memcpy (mono_array_addr (keyToken, guint8, 0), pkey_ptr, pkey_len);
- }
- } else {
- MonoArray *keyToken = mono_array_new_checked (domain, mono_defaults.byte_class, 0, &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
+ MonoTableInfo *t = &image->tables [MONO_TABLE_ASSEMBLYREF];
+ int count = t->rows;
- MONO_OBJECT_SETREF (aname, keyToken, keyToken);
- }
-
- /* 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). */
+ GPtrArray *result = g_ptr_array_sized_new (count);
- mono_array_setref (result, i, aname);
+ for (int i = 0; i < count; i++) {
+ MonoAssemblyName *aname = create_referenced_assembly_name (domain, image, t, i, error);
+ if (!is_ok (error))
+ break;
+ g_ptr_array_add (result, aname);
}
return result;
}
}
ICALL_EXPORT void *
-ves_icall_System_Reflection_Assembly_GetManifestResourceInternal (MonoReflectionAssembly *assembly, MonoString *name, gint32 *size, MonoReflectionModule **ref_module)
+ves_icall_System_Reflection_Assembly_GetManifestResourceInternal (MonoReflectionAssemblyHandle assembly_h, MonoStringHandle name, gint32 *size, MonoReflectionModuleHandleOut ref_module, MonoError *error)
{
- MonoError error;
- MonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];
+ mono_error_init (error);
+ MonoDomain *domain = MONO_HANDLE_DOMAIN (assembly_h);
+ MonoAssembly *assembly = MONO_HANDLE_GETVAL (assembly_h, assembly);
+ MonoTableInfo *table = &assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];
guint32 i;
guint32 cols [MONO_MANIFEST_SIZE];
guint32 impl, file_idx;
const char *val;
MonoImage *module;
- char *n = mono_string_to_utf8_checked (name, &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
+ char *n = mono_string_handle_to_utf8 (name, error);
+ return_val_if_nok (error, NULL);
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]);
+ val = mono_metadata_string_heap (assembly->image, cols [MONO_MANIFEST_NAME]);
if (strcmp (val, n) == 0)
break;
}
g_assert ((impl & MONO_IMPLEMENTATION_MASK) == MONO_IMPLEMENTATION_FILE);
file_idx = impl >> MONO_IMPLEMENTATION_BITS;
- module = mono_image_load_file_for_image_checked (assembly->assembly->image, file_idx, &error);
- if (mono_error_set_pending_exception (&error) || !module)
+ module = mono_image_load_file_for_image_checked (assembly->image, file_idx, error);
+ if (!is_ok (error) || !module)
return NULL;
}
else
- module = assembly->assembly->image;
+ module = assembly->image;
- MonoReflectionModule *rm = mono_module_get_object_checked (mono_domain_get (), module, &error);
- if (mono_error_set_pending_exception (&error))
+ MonoReflectionModuleHandle rm = mono_module_get_object_handle (domain, module, error);
+ if (!is_ok (error))
return NULL;
- mono_gc_wbarrier_generic_store (ref_module, (MonoObject*) rm);
+ MONO_HANDLE_ASSIGN (ref_module, rm);
return (void*)mono_image_get_resource (module, cols [MONO_MANIFEST_OFFSET], (guint32*)size);
}
-ICALL_EXPORT gboolean
-ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (MonoReflectionAssembly *assembly, MonoString *name, MonoManifestResourceInfo *info)
+static gboolean
+get_manifest_resource_info_internal (MonoReflectionAssemblyHandle assembly_h, MonoStringHandle name, MonoManifestResourceInfoHandle info, MonoError *error)
{
- MonoError error;
- MonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];
+ HANDLE_FUNCTION_ENTER ();
+ MonoDomain *domain = MONO_HANDLE_DOMAIN (assembly_h);
+ MonoAssembly *assembly = MONO_HANDLE_GETVAL (assembly_h, assembly);
+ MonoTableInfo *table = &assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];
int i;
guint32 cols [MONO_MANIFEST_SIZE];
guint32 file_cols [MONO_FILE_SIZE];
const char *val;
char *n;
- n = mono_string_to_utf8_checked (name, &error);
- if (mono_error_set_pending_exception (&error))
- return FALSE;
+ gboolean result = FALSE;
+
+ n = mono_string_handle_to_utf8 (name, error);
+ if (!is_ok (error))
+ goto leave;
+
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]);
+ val = mono_metadata_string_heap (assembly->image, cols [MONO_MANIFEST_NAME]);
if (strcmp (val, n) == 0)
break;
}
g_free (n);
if (i == table->rows)
- return FALSE;
+ goto leave;
if (!cols [MONO_MANIFEST_IMPLEMENTATION]) {
- info->location = RESOURCE_LOCATION_EMBEDDED | RESOURCE_LOCATION_IN_MANIFEST;
+ MONO_HANDLE_SETVAL (info, location, guint32, RESOURCE_LOCATION_EMBEDDED | RESOURCE_LOCATION_IN_MANIFEST);
}
else {
switch (cols [MONO_MANIFEST_IMPLEMENTATION] & MONO_IMPLEMENTATION_MASK) {
case MONO_IMPLEMENTATION_FILE:
i = cols [MONO_MANIFEST_IMPLEMENTATION] >> MONO_IMPLEMENTATION_BITS;
- table = &assembly->assembly->image->tables [MONO_TABLE_FILE];
+ table = &assembly->image->tables [MONO_TABLE_FILE];
mono_metadata_decode_row (table, i - 1, file_cols, MONO_FILE_SIZE);
- val = mono_metadata_string_heap (assembly->assembly->image, file_cols [MONO_FILE_NAME]);
- MONO_OBJECT_SETREF (info, filename, mono_string_new (mono_object_domain (assembly), val));
+ val = mono_metadata_string_heap (assembly->image, file_cols [MONO_FILE_NAME]);
+ MONO_HANDLE_SET (info, filename, mono_string_new_handle (domain, val, error));
if (file_cols [MONO_FILE_FLAGS] & FILE_CONTAINS_NO_METADATA)
- info->location = 0;
+ MONO_HANDLE_SETVAL (info, location, guint32, 0);
else
- info->location = RESOURCE_LOCATION_EMBEDDED;
+ MONO_HANDLE_SETVAL (info, location, guint32, RESOURCE_LOCATION_EMBEDDED);
break;
case MONO_IMPLEMENTATION_ASSEMBLYREF:
i = cols [MONO_MANIFEST_IMPLEMENTATION] >> MONO_IMPLEMENTATION_BITS;
- mono_assembly_load_reference (assembly->assembly->image, i - 1);
- if (assembly->assembly->image->references [i - 1] == (gpointer)-1) {
- char *msg = g_strdup_printf ("Assembly %d referenced from assembly %s not found ", i - 1, assembly->assembly->image->name);
- MonoException *ex = mono_get_exception_file_not_found2 (msg, NULL);
- g_free (msg);
- mono_set_pending_exception (ex);
- return FALSE;
- }
- MonoReflectionAssembly *assm_obj;
- assm_obj = mono_assembly_get_object_checked (mono_domain_get (), assembly->assembly->image->references [i - 1], &error);
- if (!assm_obj) {
- mono_error_set_pending_exception (&error);
- return FALSE;
+ mono_assembly_load_reference (assembly->image, i - 1);
+ if (assembly->image->references [i - 1] == REFERENCE_MISSING) {
+ mono_error_set_assembly_load (error, NULL, "Assembly %d referenced from assembly %s not found ", i - 1, assembly->image->name);
+ goto leave;
}
- MONO_OBJECT_SETREF (info, assembly, assm_obj);
+ MonoReflectionAssemblyHandle assm_obj = mono_assembly_get_object_handle (mono_domain_get (), assembly->image->references [i - 1], error);
+ if (!is_ok (error))
+ goto leave;
+ MONO_HANDLE_SET (info, assembly, assm_obj);
/* Obtain info recursively */
- ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (info->assembly, name, info);
- info->location |= RESOURCE_LOCATION_ANOTHER_ASSEMBLY;
+ get_manifest_resource_info_internal (assm_obj, name, info, error);
+ if (!is_ok (error))
+ goto leave;
+ guint32 location = MONO_HANDLE_GETVAL (info, location);
+ location |= RESOURCE_LOCATION_ANOTHER_ASSEMBLY;
+ MONO_HANDLE_SETVAL (info, location, guint32, location);
break;
case MONO_IMPLEMENTATION_EXP_TYPE:
}
}
- return TRUE;
+ result = TRUE;
+leave:
+ HANDLE_FUNCTION_RETURN_VAL (result);
}
-ICALL_EXPORT MonoObject*
-ves_icall_System_Reflection_Assembly_GetFilesInternal (MonoReflectionAssembly *assembly, MonoString *name, MonoBoolean resource_modules)
+ICALL_EXPORT gboolean
+ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (MonoReflectionAssemblyHandle assembly_h, MonoStringHandle name, MonoManifestResourceInfoHandle info_h, MonoError *error)
{
- MonoError error;
- MonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_FILE];
- MonoArray *result = NULL;
+ mono_error_init (error);
+ return get_manifest_resource_info_internal (assembly_h, name, info_h, error);
+}
+
+static gboolean
+add_filename_to_files_array (MonoDomain *domain, MonoAssembly * assembly, MonoTableInfo *table, int i, MonoArrayHandle dest, int dest_idx, MonoError *error)
+{
+ HANDLE_FUNCTION_ENTER();
+ mono_error_init (error);
+ const char *val = mono_metadata_string_heap (assembly->image, mono_metadata_decode_row_col (table, i, MONO_FILE_NAME));
+ char *n = g_concat_dir_and_file (assembly->basedir, val);
+ MonoStringHandle str = mono_string_new_handle (domain, n, error);
+ g_free (n);
+ if (!is_ok (error))
+ goto leave;
+ MONO_HANDLE_ARRAY_SETREF (dest, dest_idx, str);
+leave:
+ HANDLE_FUNCTION_RETURN_VAL (is_ok (error));
+}
+
+ICALL_EXPORT MonoObjectHandle
+ves_icall_System_Reflection_Assembly_GetFilesInternal (MonoReflectionAssemblyHandle assembly_h, MonoStringHandle name, MonoBoolean resource_modules, MonoError *error)
+{
+ mono_error_init (error);
+ MonoDomain *domain = MONO_HANDLE_DOMAIN (assembly_h);
+ MonoAssembly *assembly = MONO_HANDLE_GETVAL (assembly_h, assembly);
+ MonoTableInfo *table = &assembly->image->tables [MONO_TABLE_FILE];
int i, count;
- const char *val;
- char *n;
/* check hash if needed */
- if (name) {
- n = mono_string_to_utf8_checked (name, &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
+ if (!MONO_HANDLE_IS_NULL(name)) {
+ char *n = mono_string_handle_to_utf8 (name, error);
+ if (!is_ok (error))
+ goto fail;
for (i = 0; i < table->rows; ++i) {
- val = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_FILE_NAME));
+ const char *val = mono_metadata_string_heap (assembly->image, mono_metadata_decode_row_col (table, i, MONO_FILE_NAME));
if (strcmp (val, n) == 0) {
- MonoString *fn;
g_free (n);
- n = g_concat_dir_and_file (assembly->assembly->basedir, val);
- fn = mono_string_new (mono_object_domain (assembly), n);
+ n = g_concat_dir_and_file (assembly->basedir, val);
+ MonoStringHandle fn = mono_string_new_handle (domain, n, error);
g_free (n);
- return (MonoObject*)fn;
+ if (!is_ok (error))
+ goto fail;
+ return MONO_HANDLE_CAST (MonoObject, fn);
}
}
g_free (n);
- return NULL;
+ return NULL_HANDLE;
}
count = 0;
count ++;
}
- result = mono_array_new_checked (mono_object_domain (assembly), mono_defaults.string_class, count, &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
-
+ MonoArrayHandle result = mono_array_new_handle (domain, mono_defaults.string_class, count, error);
+ if (!is_ok (error))
+ goto fail;
count = 0;
for (i = 0; i < table->rows; ++i) {
if (resource_modules || !(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA)) {
- val = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_FILE_NAME));
- n = g_concat_dir_and_file (assembly->assembly->basedir, val);
- mono_array_setref (result, count, mono_string_new (mono_object_domain (assembly), n));
- g_free (n);
- count ++;
+ if (!add_filename_to_files_array (domain, assembly, table, i, result, count, error))
+ goto fail;
+ count++;
}
}
- return (MonoObject*)result;
+ return MONO_HANDLE_CAST (MonoObject, result);
+fail:
+ return NULL_HANDLE;
}
-ICALL_EXPORT MonoArray*
-ves_icall_System_Reflection_Assembly_GetModulesInternal (MonoReflectionAssembly *assembly)
+static gboolean
+add_module_to_modules_array (MonoDomain *domain, MonoArrayHandle dest, int *dest_idx, MonoImage* module, MonoError *error)
{
- MonoError error;
+ HANDLE_FUNCTION_ENTER ();
+ mono_error_init (error);
+ if (module) {
+ MonoReflectionModuleHandle rm = mono_module_get_object_handle (domain, module, error);
+ if (!is_ok (error))
+ goto leave;
+
+ MONO_HANDLE_ARRAY_SETREF (dest, *dest_idx, rm);
+ ++(*dest_idx);
+ }
+
+leave:
+ HANDLE_FUNCTION_RETURN_VAL (is_ok (error));
+}
+
+static gboolean
+add_file_to_modules_array (MonoDomain *domain, MonoArrayHandle dest, int dest_idx, MonoImage *image, MonoTableInfo *table, int table_idx, MonoError *error)
+{
+ HANDLE_FUNCTION_ENTER ();
+ mono_error_init (error);
+
+ guint32 cols [MONO_FILE_SIZE];
+ mono_metadata_decode_row (table, table_idx, cols, MONO_FILE_SIZE);
+ if (cols [MONO_FILE_FLAGS] & FILE_CONTAINS_NO_METADATA) {
+ MonoReflectionModuleHandle rm = mono_module_file_get_object_handle (domain, image, table_idx, error);
+ if (!is_ok (error))
+ goto leave;
+ MONO_HANDLE_ARRAY_SETREF (dest, dest_idx, rm);
+ } else {
+ MonoImage *m = mono_image_load_file_for_image_checked (image, table_idx + 1, error);
+ if (!is_ok (error))
+ goto leave;
+ if (!m) {
+ const char *filename = mono_metadata_string_heap (image, cols [MONO_FILE_NAME]);
+ mono_error_set_assembly_load (error, g_strdup (filename), "%s", "");
+ goto leave;
+ }
+ MonoReflectionModuleHandle rm = mono_module_get_object_handle (domain, m, error);
+ if (!is_ok (error))
+ goto leave;
+ MONO_HANDLE_ARRAY_SETREF (dest, dest_idx, rm);
+ }
+
+leave:
+ HANDLE_FUNCTION_RETURN_VAL (is_ok (error));
+}
+
+ICALL_EXPORT MonoArrayHandle
+ves_icall_System_Reflection_Assembly_GetModulesInternal (MonoReflectionAssemblyHandle assembly_h, MonoError *error)
+{
+ mono_error_init (error);
MonoDomain *domain = mono_domain_get();
- MonoArray *res;
+ MonoAssembly *assembly = MONO_HANDLE_GETVAL (assembly_h, assembly);
MonoClass *klass;
int i, j, file_count = 0;
MonoImage **modules;
guint32 module_count, real_module_count;
MonoTableInfo *table;
- guint32 cols [MONO_FILE_SIZE];
- MonoImage *image = assembly->assembly->image;
+ MonoImage *image = assembly->image;
g_assert (image != NULL);
- g_assert (!assembly_is_dynamic (assembly->assembly));
+ g_assert (!assembly_is_dynamic (assembly));
table = &image->tables [MONO_TABLE_FILE];
file_count = table->rows;
real_module_count ++;
klass = mono_class_get_module_class ();
- res = mono_array_new_checked (domain, klass, 1 + real_module_count + file_count, &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
+ MonoArrayHandle res = mono_array_new_handle (domain, klass, 1 + real_module_count + file_count, error);
+ if (!is_ok (error))
+ goto fail;
- MonoReflectionModule *image_obj = mono_module_get_object_checked (domain, image, &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
+ MonoReflectionModuleHandle image_obj = mono_module_get_object_handle (domain, image, error);
+ if (!is_ok (error))
+ goto fail;
+
+ MONO_HANDLE_ARRAY_SETREF (res, 0, image_obj);
- mono_array_setref (res, 0, image_obj);
j = 1;
for (i = 0; i < module_count; ++i)
- if (modules [i]) {
- MonoReflectionModule *rm = mono_module_get_object_checked (domain, modules[i], &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
- mono_array_setref (res, j, rm);
- ++j;
- }
+ if (!add_module_to_modules_array (domain, res, &j, modules[i], error))
+ goto fail;
for (i = 0; i < file_count; ++i, ++j) {
- mono_metadata_decode_row (table, i, cols, MONO_FILE_SIZE);
- if (cols [MONO_FILE_FLAGS] & FILE_CONTAINS_NO_METADATA) {
- MonoReflectionModule *rm = mono_module_file_get_object_checked (domain, image, i, &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
- mono_array_setref (res, j, rm);
- }
- else {
- MonoImage *m = mono_image_load_file_for_image_checked (image, i + 1, &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
- if (!m) {
- MonoString *fname = mono_string_new (mono_domain_get (), mono_metadata_string_heap (image, cols [MONO_FILE_NAME]));
- mono_set_pending_exception (mono_get_exception_file_not_found2 (NULL, fname));
- return NULL;
- }
- MonoReflectionModule *rm = mono_module_get_object_checked (domain, m, &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
- mono_array_setref (res, j, rm);
- }
+ if (!add_file_to_modules_array (domain, res, j, image, table, i, error))
+ goto fail;
}
return res;
+fail:
+ return MONO_HANDLE_CAST (MonoArray, NULL_HANDLE);
}
-ICALL_EXPORT MonoReflectionMethod*
-ves_icall_GetCurrentMethod (void)
+ICALL_EXPORT MonoReflectionMethodHandle
+ves_icall_GetCurrentMethod (MonoError *error)
{
- MonoReflectionMethod *res = NULL;
- MonoError error;
+ mono_error_init (error);
MonoMethod *m = mono_method_get_last_managed ();
if (!m) {
- mono_set_pending_exception (mono_get_exception_not_supported ("Stack walks are not supported on this platform."));
- return NULL;
+ mono_error_set_not_supported (error, "Stack walks are not supported on this platform.");
+ return MONO_HANDLE_CAST (MonoReflectionMethod, NULL_HANDLE);
}
while (m->is_inflated)
m = ((MonoMethodInflated*)m)->declaring;
- res = mono_method_get_object_checked (mono_domain_get (), m, NULL, &error);
- mono_error_set_pending_exception (&error);
- return res;
+ return mono_method_get_object_handle (mono_domain_get (), m, NULL, error);
}
MonoGenericContext ctx;
ctx.method_inst = inflated->context.method_inst;
ctx.class_inst = inflated->context.class_inst;
- if (klass->generic_class)
- ctx.class_inst = klass->generic_class->context.class_inst;
- else if (klass->generic_container)
- ctx.class_inst = klass->generic_container->context.class_inst;
+ if (mono_class_is_ginst (klass))
+ ctx.class_inst = mono_class_get_generic_class (klass)->context.class_inst;
+ else if (mono_class_is_gtd (klass))
+ ctx.class_inst = mono_class_get_generic_container (klass)->context.class_inst;
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);
if (mono_class_has_failure (method->klass))
return NULL;
- for (i = 0; i < method->klass->method.count; ++i) {
+ int mcount = mono_class_get_method_count (method->klass);
+ for (i = 0; i < mcount; ++i) {
if (method->klass->methods [i] == method) {
offset = i;
break;
mono_class_setup_methods (klass);
if (mono_class_has_failure (klass))
return NULL;
- g_assert (offset >= 0 && offset < klass->method.count);
+ g_assert (offset >= 0 && offset < mono_class_get_method_count (klass));
return klass->methods [offset];
}
-ICALL_EXPORT MonoReflectionMethod*
-ves_icall_System_Reflection_MethodBase_GetMethodFromHandleInternalType_native (MonoMethod *method, MonoType *type, MonoBoolean generic_check)
+ICALL_EXPORT MonoReflectionMethodHandle
+ves_icall_System_Reflection_MethodBase_GetMethodFromHandleInternalType_native (MonoMethod *method, MonoType *type, MonoBoolean generic_check, MonoError *error)
{
- MonoReflectionMethod *res = NULL;
- MonoError error;
+ mono_error_init (error);
MonoClass *klass;
if (type && generic_check) {
klass = mono_class_from_mono_type (type);
if (mono_class_get_generic_type_definition (method->klass) != mono_class_get_generic_type_definition (klass))
- return NULL;
+ return MONO_HANDLE_CAST (MonoReflectionMethod, NULL_HANDLE);
if (method->klass != klass) {
method = mono_method_get_equivalent_method (method, klass);
if (!method)
- return NULL;
+ return MONO_HANDLE_CAST (MonoReflectionMethod, NULL_HANDLE);
}
} else if (type)
klass = mono_class_from_mono_type (type);
else
klass = method->klass;
- res = mono_method_get_object_checked (mono_domain_get (), method, klass, &error);
- mono_error_set_pending_exception (&error);
- return res;
+ return mono_method_get_object_handle (mono_domain_get (), method, klass, error);
}
-ICALL_EXPORT MonoReflectionMethodBody*
-ves_icall_System_Reflection_MethodBase_GetMethodBodyInternal (MonoMethod *method)
+ICALL_EXPORT MonoReflectionMethodBodyHandle
+ves_icall_System_Reflection_MethodBase_GetMethodBodyInternal (MonoMethod *method, MonoError *error)
{
- MonoError error;
- MonoReflectionMethodBody *result = mono_method_body_get_object_checked (mono_domain_get (), method, &error);
- mono_error_set_pending_exception (&error);
- return result;
+ mono_error_init (error);
+ return mono_method_body_get_object_handle (mono_domain_get (), method, error);
}
-ICALL_EXPORT MonoReflectionAssembly*
-ves_icall_System_Reflection_Assembly_GetExecutingAssembly (void)
+ICALL_EXPORT MonoReflectionAssemblyHandle
+ves_icall_System_Reflection_Assembly_GetExecutingAssembly (MonoError *error)
{
- MonoError error;
- MonoReflectionAssembly *result;
- MonoMethod *dest = NULL;
+ mono_error_init (error);
+ MonoMethod *dest = NULL;
mono_stack_walk_no_il (get_executing, &dest);
g_assert (dest);
- result = mono_assembly_get_object_checked (mono_domain_get (), dest->klass->image->assembly, &error);
- if (!result)
- mono_error_set_pending_exception (&error);
- return result;
+ return mono_assembly_get_object_handle (mono_domain_get (), dest->klass->image->assembly, error);
}
-ICALL_EXPORT MonoReflectionAssembly*
-ves_icall_System_Reflection_Assembly_GetEntryAssembly (void)
+ICALL_EXPORT MonoReflectionAssemblyHandle
+ves_icall_System_Reflection_Assembly_GetEntryAssembly (MonoError *error)
{
- MonoError error;
- MonoReflectionAssembly *result;
+ mono_error_init (error);
+
MonoDomain* domain = mono_domain_get ();
if (!domain->entry_assembly)
- return NULL;
+ return MONO_HANDLE_CAST (MonoReflectionAssembly, NULL_HANDLE);
- result = mono_assembly_get_object_checked (domain, domain->entry_assembly, &error);
- if (!result)
- mono_error_set_pending_exception (&error);
- return result;
+ return mono_assembly_get_object_handle (domain, domain->entry_assembly, error);
}
-ICALL_EXPORT MonoReflectionAssembly*
-ves_icall_System_Reflection_Assembly_GetCallingAssembly (void)
+ICALL_EXPORT MonoReflectionAssemblyHandle
+ves_icall_System_Reflection_Assembly_GetCallingAssembly (MonoError *error)
{
- MonoError error;
+ mono_error_init (error);
MonoMethod *m;
MonoMethod *dest;
- MonoReflectionAssembly *result;
dest = NULL;
mono_stack_walk_no_il (get_executing, &dest);
if (!dest)
dest = m;
if (!m) {
- mono_set_pending_exception (mono_get_exception_not_supported ("Stack walks are not supported on this platform."));
- return NULL;
+ mono_error_set_not_supported (error, "Stack walks are not supported on this platform.");
+ return MONO_HANDLE_CAST (MonoReflectionAssembly, NULL_HANDLE);
}
- result = mono_assembly_get_object_checked (mono_domain_get (), dest->klass->image->assembly, &error);
- if (!result)
- mono_error_set_pending_exception (&error);
- return result;
+ return mono_assembly_get_object_handle (mono_domain_get (), dest->klass->image->assembly, error);
}
ICALL_EXPORT MonoStringHandle
return mono_security_core_clr_method_level (method, TRUE);
}
-static void
-fill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *aname, MonoAssemblyName *name, const char *absolute, gboolean by_default_version, gboolean default_publickey, gboolean default_token, MonoError *error)
+ICALL_EXPORT MonoStringHandle
+ves_icall_System_Reflection_Assembly_get_fullName (MonoReflectionAssemblyHandle assembly, MonoError *error)
{
- static MonoMethod *create_culture = NULL;
- MonoObject *obj;
- gpointer args [2];
- guint32 pkey_len;
- const char *pkey_ptr;
- gchar *codebase;
- MonoBoolean assembly_ref = 0;
-
mono_error_init (error);
-
- MONO_OBJECT_SETREF (aname, name, mono_string_new (domain, name->name));
- aname->major = name->major;
- aname->minor = name->minor;
- aname->build = name->build;
- aname->flags = name->flags;
- aname->revision = name->revision;
- aname->hashalg = name->hash_alg;
- aname->versioncompat = 1; /* SameMachine (default) */
- aname->processor_architecture = name->arch;
-
- if (by_default_version) {
- MonoObject *version;
-
- version = create_version (domain, name->major, name->minor, name->build, name->revision, error);
- return_if_nok (error);
-
- MONO_OBJECT_SETREF (aname, version, version);
- }
-
- codebase = NULL;
- if (absolute != NULL && *absolute != '\0') {
- gchar *result;
-
- codebase = g_strdup (absolute);
-
- mono_icall_make_platform_path (codebase);
-
- const gchar *prepend = mono_icall_get_file_path_prefix (codebase);
-
- result = g_strconcat (prepend, codebase, NULL);
- g_free (codebase);
- codebase = result;
- }
-
- if (codebase) {
- MONO_OBJECT_SETREF (aname, codebase, mono_string_new (domain, codebase));
- g_free (codebase);
- }
-
- if (!create_culture) {
- MonoMethodDesc *desc = mono_method_desc_new ("System.Globalization.CultureInfo:CreateCulture(string,bool)", TRUE);
- create_culture = mono_method_desc_search_in_image (desc, mono_defaults.corlib);
- g_assert (create_culture);
- mono_method_desc_free (desc);
- }
-
- if (name->culture) {
- args [0] = mono_string_new (domain, name->culture);
- args [1] = &assembly_ref;
-
- obj = mono_runtime_invoke_checked (create_culture, NULL, args, error);
- return_if_nok (error);
-
- MONO_OBJECT_SETREF (aname, cultureInfo, obj);
- }
-
- if (name->public_key) {
- pkey_ptr = (char*)name->public_key;
- pkey_len = mono_metadata_decode_blob_size (pkey_ptr, &pkey_ptr);
-
- MonoArray *pkey = mono_array_new_checked (domain, mono_defaults.byte_class, pkey_len, error);
- return_if_nok (error);
- MONO_OBJECT_SETREF (aname, publicKey, pkey);
- memcpy (mono_array_addr (aname->publicKey, guint8, 0), pkey_ptr, pkey_len);
- aname->flags |= ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG;
- } else if (default_publickey) {
- MonoArray *pkey = mono_array_new_checked (domain, mono_defaults.byte_class, 0, error);
- return_if_nok (error);
- MONO_OBJECT_SETREF (aname, publicKey, pkey);
- aname->flags |= ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG;
- }
-
- /* MonoAssemblyName keeps the public key token as an hexadecimal string */
- if (name->public_key_token [0]) {
- int i, j;
- char *p;
-
- MonoArray *keyToken = mono_array_new_checked (domain, mono_defaults.byte_class, 8, error);
- return_if_nok (error);
-
- MONO_OBJECT_SETREF (aname, keyToken, keyToken);
- p = mono_array_addr (keyToken, char, 0);
-
- for (i = 0, j = 0; i < 8; i++) {
- *p = g_ascii_xdigit_value (name->public_key_token [j++]) << 4;
- *p |= g_ascii_xdigit_value (name->public_key_token [j++]);
- p++;
- }
- } else if (default_token) {
- MonoArray *keyToken = mono_array_new_checked (domain, mono_defaults.byte_class, 0, error);
- return_if_nok (error);
- MONO_OBJECT_SETREF (aname, keyToken, keyToken);
- }
-}
-
-ICALL_EXPORT MonoString *
-ves_icall_System_Reflection_Assembly_get_fullName (MonoReflectionAssembly *assembly)
-{
- MonoDomain *domain = mono_object_domain (assembly);
- MonoAssembly *mass = assembly->assembly;
- MonoString *res;
+ MonoDomain *domain = MONO_HANDLE_DOMAIN (assembly);
+ MonoAssembly *mass = MONO_HANDLE_GETVAL (assembly, assembly);
gchar *name;
name = mono_stringify_assembly_name (&mass->aname);
- res = mono_string_new (domain, name);
+ MonoStringHandle res = mono_string_new_handle (domain, name, error);
g_free (name);
-
return res;
}
}
ICALL_EXPORT void
-ves_icall_System_Reflection_Assembly_InternalGetAssemblyName (MonoString *fname, MonoReflectionAssemblyName *aname)
+ves_icall_System_Reflection_Assembly_InternalGetAssemblyName (MonoStringHandle fname, MonoAssemblyName *name, MonoStringHandleOut normalized_codebase, MonoError *error)
{
- MonoError error;
char *filename;
MonoImageOpenStatus status = MONO_IMAGE_OK;
+ char *codebase = NULL;
gboolean res;
MonoImage *image;
- MonoAssemblyName name;
char *dirname;
- filename = mono_string_to_utf8_checked (fname, &error);
- if (mono_error_set_pending_exception (&error))
- return;
+ mono_error_init (error);
+
+ filename = mono_string_handle_to_utf8 (fname, error);
+ return_if_nok (error);
dirname = g_path_get_dirname (filename);
replace_shadow_path (mono_domain_get (), dirname, &filename);
image = mono_image_open (filename, &status);
if (!image){
- MonoException *exc;
-
- g_free (filename);
if (status == MONO_IMAGE_IMAGE_INVALID)
- exc = mono_get_exception_bad_image_format2 (NULL, fname);
+ mono_error_set_bad_image_name (error, g_strdup (filename), "%s", "");
else
- exc = mono_get_exception_file_not_found2 (NULL, fname);
- mono_set_pending_exception (exc);
+ mono_error_set_assembly_load (error, g_strdup (filename), "%s", "");
+ g_free (filename);
return;
}
- res = mono_assembly_fill_assembly_name (image, &name);
+ res = mono_assembly_fill_assembly_name_full (image, name, TRUE);
if (!res) {
mono_image_close (image);
g_free (filename);
- mono_set_pending_exception (mono_get_exception_argument ("assemblyFile", "The file does not contain a manifest"));
+ mono_error_set_argument (error, "assemblyFile", "The file does not contain a manifest");
return;
}
- fill_reflection_assembly_name (mono_domain_get (), aname, &name, filename, TRUE, FALSE, TRUE, &error);
- mono_error_set_pending_exception (&error);
+ if (filename != NULL && *filename != '\0') {
+ gchar *result;
+
+ codebase = g_strdup (filename);
+
+ mono_icall_make_platform_path (codebase);
+
+ const gchar *prepend = mono_icall_get_file_path_prefix (codebase);
+
+ result = g_strconcat (prepend, codebase, NULL);
+ g_free (codebase);
+ codebase = result;
+ }
+ MONO_HANDLE_ASSIGN (normalized_codebase, mono_string_new_handle (mono_domain_get (), codebase, error));
+ g_free (codebase);
mono_image_close (image);
g_free (filename);
}
ICALL_EXPORT MonoBoolean
-ves_icall_System_Reflection_Assembly_LoadPermissions (MonoReflectionAssembly *assembly,
- char **minimum, guint32 *minLength, char **optional, guint32 *optLength, char **refused, guint32 *refLength)
+ves_icall_System_Reflection_Assembly_LoadPermissions (MonoReflectionAssemblyHandle assembly_h,
+ char **minimum, guint32 *minLength, char **optional, guint32 *optLength, char **refused, guint32 *refLength, MonoError *error)
{
+ mono_error_init (error);
+ MonoAssembly *assembly = MONO_HANDLE_GETVAL (assembly_h, assembly);
MonoBoolean result = FALSE;
MonoDeclSecurityEntry entry;
/* SecurityAction.RequestMinimum */
- if (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQMIN, &entry)) {
+ if (mono_declsec_get_assembly_action (assembly, SECURITY_ACTION_REQMIN, &entry)) {
*minimum = entry.blob;
*minLength = entry.size;
result = TRUE;
}
/* SecurityAction.RequestOptional */
- if (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQOPT, &entry)) {
+ if (mono_declsec_get_assembly_action (assembly, SECURITY_ACTION_REQOPT, &entry)) {
*optional = entry.blob;
*optLength = entry.size;
result = TRUE;
}
/* SecurityAction.RequestRefuse */
- if (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQREFUSE, &entry)) {
+ if (mono_declsec_get_assembly_action (assembly, SECURITY_ACTION_REQREFUSE, &entry)) {
*refused = entry.blob;
*refLength = entry.size;
result = TRUE;
return TRUE;
}
-static MonoArray*
-mono_module_get_types (MonoDomain *domain, MonoImage *image, MonoArray **exceptions, MonoBoolean exportedOnly, MonoError *error)
+static void
+image_get_type (MonoDomain *domain, MonoImage *image, MonoTableInfo *tdef, int table_idx, int count, MonoArrayHandle res, MonoArrayHandle exceptions, MonoBoolean exportedOnly, MonoError *error)
+{
+ mono_error_init (error);
+ HANDLE_FUNCTION_ENTER ();
+ MonoError klass_error;
+ MonoClass *klass = mono_class_get_checked (image, table_idx | MONO_TOKEN_TYPE_DEF, &klass_error);
+
+ if (klass) {
+ MonoReflectionTypeHandle rt = mono_type_get_object_handle (domain, &klass->byval_arg, error);
+ return_if_nok (error);
+
+ MONO_HANDLE_ARRAY_SETREF (res, count, rt);
+ } else {
+ MonoException *ex = mono_error_convert_to_exception (error);
+ MONO_HANDLE_ARRAY_SETRAW (exceptions, count, ex);
+ }
+ HANDLE_FUNCTION_RETURN ();
+}
+
+static MonoArrayHandle
+mono_module_get_types (MonoDomain *domain, MonoImage *image, MonoArrayHandleOut exceptions, MonoBoolean exportedOnly, MonoError *error)
{
- MonoReflectionType *rt;
- MonoArray *res;
- MonoClass *klass;
MonoTableInfo *tdef = &image->tables [MONO_TABLE_TYPEDEF];
int i, count;
} else {
count = tdef->rows - 1;
}
- res = mono_array_new_checked (domain, mono_defaults.runtimetype_class, count, error);
- return_val_if_nok (error, NULL);
- *exceptions = mono_array_new_checked (domain, mono_defaults.exception_class, count, error);
- return_val_if_nok (error, NULL);
+ MonoArrayHandle res = mono_array_new_handle (domain, mono_defaults.runtimetype_class, count, error);
+ return_val_if_nok (error, MONO_HANDLE_CAST (MonoArray, NULL_HANDLE));
+ MONO_HANDLE_ASSIGN (exceptions, mono_array_new_handle (domain, mono_defaults.exception_class, count, error));
+ return_val_if_nok (error, MONO_HANDLE_CAST (MonoArray, NULL_HANDLE));
count = 0;
for (i = 1; i < tdef->rows; ++i) {
- if (!exportedOnly || mono_module_type_is_visible (tdef, image, i + 1)) {
- klass = mono_class_get_checked (image, (i + 1) | MONO_TOKEN_TYPE_DEF, error);
-
- if (klass) {
- rt = mono_type_get_object_checked (domain, &klass->byval_arg, error);
- return_val_if_nok (error, NULL);
-
- mono_array_setref (res, count, rt);
- } else {
- MonoException *ex = mono_error_convert_to_exception (error);
- mono_array_setref (*exceptions, count, ex);
- }
+ if (!exportedOnly || mono_module_type_is_visible (tdef, image, i+1)) {
+ image_get_type (domain, image, tdef, i + 1, count, res, exceptions, exportedOnly, error);
+ return_val_if_nok (error, MONO_HANDLE_CAST (MonoArray, NULL_HANDLE));
count++;
}
}
return res;
}
-ICALL_EXPORT MonoArray*
-ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly, MonoBoolean exportedOnly)
+static void
+append_module_types (MonoDomain *domain, MonoArrayHandleOut res, MonoArrayHandleOut exceptions, MonoImage *image, MonoBoolean exportedOnly, MonoError *error)
{
- MonoError error;
- MonoArray *res = NULL;
- MonoArray *exceptions = NULL;
- MonoImage *image = NULL;
- MonoTableInfo *table = NULL;
- MonoDomain *domain;
- GList *list = NULL;
- int i, len, ex_count;
+ HANDLE_FUNCTION_ENTER ();
+ mono_error_init (error);
+ MonoArrayHandle ex2 = MONO_HANDLE_NEW (MonoArray, NULL);
+ MonoArrayHandle res2 = mono_module_get_types (domain, image, ex2, exportedOnly, error);
+ if (!is_ok (error))
+ goto leave;
- domain = mono_object_domain (assembly);
+ /* Append the new types to the end of the array */
+ if (mono_array_handle_length (res2) > 0) {
+ guint32 len1, len2;
- g_assert (!assembly_is_dynamic (assembly->assembly));
- image = assembly->assembly->image;
- table = &image->tables [MONO_TABLE_FILE];
- res = mono_module_get_types (domain, image, &exceptions, exportedOnly, &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
+ len1 = mono_array_handle_length (res);
+ len2 = mono_array_handle_length (res2);
- /* Append data from all modules in the assembly */
- for (i = 0; i < table->rows; ++i) {
- if (!(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA)) {
- MonoImage *loaded_image = mono_assembly_load_module_checked (image->assembly, i + 1, &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
- if (loaded_image) {
- MonoArray *ex2;
- MonoArray *res2;
+ MonoArrayHandle res3 = mono_array_new_handle (domain, mono_defaults.runtimetype_class, len1 + len2, error);
+ if (!is_ok (error))
+ goto leave;
- res2 = mono_module_get_types (domain, loaded_image, &ex2, exportedOnly, &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
+ mono_array_handle_memcpy_refs (res3, 0, res, 0, len1);
+ mono_array_handle_memcpy_refs (res3, len1, res2, 0, len2);
+ MONO_HANDLE_ASSIGN (res, res3);
+ MonoArrayHandle ex3 = mono_array_new_handle (domain, mono_defaults.runtimetype_class, len1 + len2, error);
+ if (!is_ok (error))
+ goto leave;
- /* Append the new types to the end of the array */
- if (mono_array_length (res2) > 0) {
- guint32 len1, len2;
- MonoArray *res3, *ex3;
+ mono_array_handle_memcpy_refs (ex3, 0, exceptions, 0, len1);
+ mono_array_handle_memcpy_refs (ex3, len1, ex2, 0, len2);
+ MONO_HANDLE_ASSIGN (exceptions, ex3);
+ }
+leave:
+ HANDLE_FUNCTION_RETURN ();
+}
- len1 = mono_array_length (res);
- len2 = mono_array_length (res2);
+static void
+set_class_failure_in_array (MonoArrayHandle exl, int i, MonoClass *klass)
+{
+ HANDLE_FUNCTION_ENTER ();
+ MonoError unboxed_error;
+ mono_error_init (&unboxed_error);
+ mono_error_set_for_class_failure (&unboxed_error, klass);
- res3 = mono_array_new_checked (domain, mono_defaults.runtimetype_class, len1 + len2, &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
- mono_array_memcpy_refs (res3, 0, res, 0, len1);
- mono_array_memcpy_refs (res3, len1, res2, 0, len2);
- res = res3;
+ MonoExceptionHandle exc = MONO_HANDLE_NEW (MonoException, mono_error_convert_to_exception (&unboxed_error));
+ MONO_HANDLE_ARRAY_SETREF (exl, i, exc);
+ HANDLE_FUNCTION_RETURN ();
+}
- ex3 = mono_array_new_checked (domain, mono_defaults.runtimetype_class, len1 + len2, &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
- mono_array_memcpy_refs (ex3, 0, exceptions, 0, len1);
- mono_array_memcpy_refs (ex3, len1, ex2, 0, len2);
- exceptions = ex3;
- }
+ICALL_EXPORT MonoArrayHandle
+ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssemblyHandle assembly_handle, MonoBoolean exportedOnly, MonoError *error)
+{
+ MonoArrayHandle exceptions = MONO_HANDLE_NEW(MonoArray, NULL);
+ int i;
+
+ MonoDomain *domain = MONO_HANDLE_DOMAIN (assembly_handle);
+ MonoAssembly *assembly = MONO_HANDLE_GETVAL (assembly_handle, assembly);
+
+ g_assert (!assembly_is_dynamic (assembly));
+ MonoImage *image = assembly->image;
+ MonoTableInfo *table = &image->tables [MONO_TABLE_FILE];
+ MonoArrayHandle res = mono_module_get_types (domain, image, exceptions, exportedOnly, error);
+ return_val_if_nok (error, MONO_HANDLE_CAST (MonoArray, NULL_HANDLE));
+
+ /* Append data from all modules in the assembly */
+ for (i = 0; i < table->rows; ++i) {
+ if (!(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA)) {
+ MonoImage *loaded_image = mono_assembly_load_module_checked (image->assembly, i + 1, error);
+ return_val_if_nok (error, MONO_HANDLE_CAST (MonoArray, NULL_HANDLE));
+
+ if (loaded_image) {
+ append_module_types (domain, res, exceptions, loaded_image, exportedOnly, error);
+ return_val_if_nok (error, MONO_HANDLE_CAST (MonoArray, NULL_HANDLE));
}
}
}
* contain all exceptions for NULL items.
*/
- len = mono_array_length (res);
+ int len = mono_array_handle_length (res);
- ex_count = 0;
+ int ex_count = 0;
+ GList *list = NULL;
+ MonoReflectionTypeHandle t = MONO_HANDLE_NEW (MonoReflectionType, NULL);
for (i = 0; i < len; i++) {
- MonoReflectionType *t = (MonoReflectionType *)mono_array_get (res, gpointer, i);
- MonoClass *klass;
+ MONO_HANDLE_ARRAY_GETREF (t, res, i);
- if (t) {
- klass = mono_type_get_class (t->type);
+ if (!MONO_HANDLE_IS_NULL (t)) {
+ MonoClass *klass = mono_type_get_class (MONO_HANDLE_GETVAL (t, type));
if ((klass != NULL) && mono_class_has_failure (klass)) {
/* keep the class in the list */
list = g_list_append (list, klass);
/* and replace Type with NULL */
- mono_array_setref (res, i, NULL);
+ MONO_HANDLE_ARRAY_SETRAW (res, i, NULL);
}
} else {
ex_count ++;
if (list || ex_count) {
GList *tmp = NULL;
- MonoException *exc = NULL;
- MonoArray *exl = NULL;
int j, length = g_list_length (list) + ex_count;
- exl = mono_array_new_checked (domain, mono_defaults.exception_class, length, &error);
- if (mono_error_set_pending_exception (&error)) {
+ MonoArrayHandle exl = mono_array_new_handle (domain, mono_defaults.exception_class, length, error);
+ if (!is_ok (error)) {
g_list_free (list);
- return NULL;
+ return MONO_HANDLE_CAST (MonoArray, NULL_HANDLE);
}
/* Types for which mono_class_get_checked () succeeded */
+ MonoExceptionHandle exc = MONO_HANDLE_NEW (MonoException, NULL);
for (i = 0, tmp = list; tmp; i++, tmp = tmp->next) {
- MonoException *exc = mono_class_get_exception_for_failure ((MonoClass *)tmp->data);
- mono_array_setref (exl, i, exc);
+ set_class_failure_in_array (exl, i, (MonoClass*)tmp->data);
}
/* Types for which it don't */
- for (j = 0; j < mono_array_length (exceptions); ++j) {
- MonoException *exc = mono_array_get (exceptions, MonoException*, j);
- if (exc) {
+ for (j = 0; j < mono_array_handle_length (exceptions); ++j) {
+ MONO_HANDLE_ARRAY_GETREF (exc, exceptions, j);
+ if (!MONO_HANDLE_IS_NULL (exc)) {
g_assert (i < length);
- mono_array_setref (exl, i, exc);
+ MONO_HANDLE_ARRAY_SETREF (exl, i, exc);
i ++;
}
}
g_list_free (list);
list = NULL;
- exc = mono_get_exception_reflection_type_load_checked (res, exl, &error);
- if (!is_ok (&error)) {
- mono_error_set_pending_exception (&error);
- return NULL;
+ MONO_HANDLE_ASSIGN (exc, mono_get_exception_reflection_type_load_checked (res, exl, error));
+ if (!is_ok (error)) {
+ return MONO_HANDLE_CAST (MonoArray, NULL_HANDLE);
}
- mono_set_pending_exception (exc);
- return NULL;
+ mono_error_set_exception_handle (error, exc);
+ return MONO_HANDLE_CAST (MonoArray, NULL_HANDLE);
}
return res;
}
ICALL_EXPORT void
-ves_icall_Mono_RuntimeMarshal_FreeAssemblyName (MonoAssemblyName *aname)
+ves_icall_Mono_RuntimeMarshal_FreeAssemblyName (MonoAssemblyName *aname, gboolean free_struct)
{
mono_assembly_name_free (aname);
+ if (free_struct)
+ g_free (aname);
}
ICALL_EXPORT gboolean
return mono_assembly_name_parse_full (name, aname, TRUE, is_version_definited, is_token_defined);
}
-ICALL_EXPORT MonoReflectionType*
-ves_icall_System_Reflection_Module_GetGlobalType (MonoReflectionModule *module)
+ICALL_EXPORT MonoReflectionTypeHandle
+ves_icall_System_Reflection_Module_GetGlobalType (MonoReflectionModuleHandle module, MonoError *error)
{
- MonoError error;
- MonoReflectionType *ret;
- MonoDomain *domain = mono_object_domain (module);
+ MonoDomain *domain = MONO_HANDLE_DOMAIN (module);
+ MonoImage *image = MONO_HANDLE_GETVAL (module, image);
MonoClass *klass;
- g_assert (module->image);
-
- if (image_is_dynamic (module->image) && ((MonoDynamicImage*)(module->image))->initial_image)
- /* These images do not have a global type */
- return NULL;
+ g_assert (image);
- klass = mono_class_get_checked (module->image, 1 | MONO_TOKEN_TYPE_DEF, &error);
- if (!mono_error_ok (&error)) {
- mono_error_set_pending_exception (&error);
- return NULL;
- }
+ MonoReflectionTypeHandle ret = MONO_HANDLE_CAST (MonoReflectionType, NULL_HANDLE);
- ret = mono_type_get_object_checked (domain, &klass->byval_arg, &error);
- if (!mono_error_ok (&error)) {
- mono_error_set_pending_exception (&error);
- return NULL;
- }
+ if (image_is_dynamic (image) && ((MonoDynamicImage*)image)->initial_image)
+ /* These images do not have a global type */
+ goto leave;
+ klass = mono_class_get_checked (image, 1 | MONO_TOKEN_TYPE_DEF, error);
+ if (!is_ok (error))
+ goto leave;
+
+ ret = mono_type_get_object_handle (domain, &klass->byval_arg, error);
+leave:
return ret;
}
ICALL_EXPORT void
-ves_icall_System_Reflection_Module_Close (MonoReflectionModule *module)
+ves_icall_System_Reflection_Module_Close (MonoReflectionModuleHandle module, MonoError *error)
{
/*if (module->image)
mono_image_close (module->image);*/
ves_icall_System_Reflection_Module_GetGuidInternal (MonoReflectionModuleHandle refmodule, MonoError *error)
{
MonoDomain *domain = MONO_HANDLE_DOMAIN (refmodule);
- MonoImage *image = MONO_HANDLE_RAW (refmodule)->image;
+ MonoImage *image = MONO_HANDLE_GETVAL (refmodule, image);
g_assert (image);
return mono_string_new_handle (domain, image->guid, error);
#ifndef HOST_WIN32
static inline gpointer
-mono_icall_module_get_hinstance (MonoReflectionModule *module)
+mono_icall_module_get_hinstance (MonoReflectionModuleHandle module)
{
return (gpointer) (-1);
}
#endif /* HOST_WIN32 */
ICALL_EXPORT gpointer
-ves_icall_System_Reflection_Module_GetHINSTANCE (MonoReflectionModule *module)
+ves_icall_System_Reflection_Module_GetHINSTANCE (MonoReflectionModuleHandle module, MonoError *error)
{
return mono_icall_module_get_hinstance (module);
}
ICALL_EXPORT void
-ves_icall_System_Reflection_Module_GetPEKind (MonoImage *image, gint32 *pe_kind, gint32 *machine)
+ves_icall_System_Reflection_Module_GetPEKind (MonoImage *image, gint32 *pe_kind, gint32 *machine, MonoError *error)
{
if (image_is_dynamic (image)) {
MonoDynamicImage *dyn = (MonoDynamicImage*)image;
}
ICALL_EXPORT gint32
-ves_icall_System_Reflection_Module_GetMDStreamVersion (MonoImage *image)
+ves_icall_System_Reflection_Module_GetMDStreamVersion (MonoImage *image, MonoError *error)
{
return (image->md_version_major << 16) | (image->md_version_minor);
}
-ICALL_EXPORT MonoArray*
-ves_icall_System_Reflection_Module_InternalGetTypes (MonoReflectionModule *module)
+ICALL_EXPORT MonoArrayHandle
+ves_icall_System_Reflection_Module_InternalGetTypes (MonoReflectionModuleHandle module, MonoError *error)
{
- MonoError error;
- MonoArray *exceptions;
- int i;
+ mono_error_init (error);
- if (!module->image) {
- MonoArray *arr = mono_array_new_checked (mono_object_domain (module), mono_defaults.runtimetype_class, 0, &error);
- mono_error_set_pending_exception (&error);
+ MonoImage *image = MONO_HANDLE_GETVAL (module, image);
+ MonoDomain *domain = MONO_HANDLE_DOMAIN (module);
+
+ if (!image) {
+ MonoArrayHandle arr = mono_array_new_handle (domain, mono_defaults.runtimetype_class, 0, error);
return arr;
} else {
- MonoArray *res;
-
- res = mono_module_get_types (mono_object_domain (module), module->image, &exceptions, FALSE, &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
-
- for (i = 0; i < mono_array_length (exceptions); ++i) {
- MonoException *ex = mono_array_get (exceptions, MonoException *, i);
- if (ex) {
- mono_set_pending_exception (ex);
- return NULL;
+ MonoArrayHandle exceptions = MONO_HANDLE_NEW (MonoArray, NULL);
+ MonoArrayHandle res = mono_module_get_types (domain, image, exceptions, FALSE, error);
+ return_val_if_nok (error, MONO_HANDLE_CAST(MonoArray, NULL_HANDLE));
+
+ int n = mono_array_handle_length (exceptions);
+ MonoExceptionHandle ex = MONO_HANDLE_NEW (MonoException, NULL);
+ for (int i = 0; i < n; ++i) {
+ MONO_HANDLE_ARRAY_GETREF(ex, exceptions, i);
+ if (!MONO_HANDLE_IS_NULL (ex)) {
+ mono_error_set_exception_handle (error, ex);
+ return MONO_HANDLE_CAST(MonoArray, NULL_HANDLE);
}
}
return res;
}
}
+static MonoGenericInst *
+get_generic_inst_from_array_handle (MonoArrayHandle type_args)
+{
+ int type_argc = mono_array_handle_length (type_args);
+ int size = MONO_SIZEOF_GENERIC_INST + type_argc * sizeof (MonoType *);
+
+ MonoGenericInst *ginst = (MonoGenericInst *)g_alloca (size);
+ memset (ginst, 0, sizeof (MonoGenericInst));
+ ginst->type_argc = type_argc;
+ for (int i = 0; i < type_argc; i++) {
+ MONO_HANDLE_ARRAY_GETVAL (ginst->type_argv[i], type_args, MonoType*, i);
+ }
+ ginst->is_open = FALSE;
+ for (int i = 0; i < type_argc; i++) {
+ if (mono_class_is_open_constructed_type (ginst->type_argv[i])) {
+ ginst->is_open = TRUE;
+ break;
+ }
+ }
+
+ return mono_metadata_get_canonical_generic_inst (ginst);
+}
+
static void
-init_generic_context_from_args (MonoGenericContext *context, MonoArray *type_args, MonoArray *method_args)
+init_generic_context_from_args_handles (MonoGenericContext *context, MonoArrayHandle type_args, MonoArrayHandle method_args)
{
- if (type_args)
- context->class_inst = mono_metadata_get_generic_inst (mono_array_length (type_args),
- mono_array_addr (type_args, MonoType*, 0));
- else
+ if (!MONO_HANDLE_IS_NULL (type_args)) {
+ context->class_inst = get_generic_inst_from_array_handle (type_args);
+ } else {
context->class_inst = NULL;
- if (method_args)
- context->method_inst = mono_metadata_get_generic_inst (mono_array_length (method_args),
- mono_array_addr (method_args, MonoType*, 0));
- else
+ }
+ if (!MONO_HANDLE_IS_NULL (method_args)) {
+ context->method_inst = get_generic_inst_from_array_handle (method_args);
+ } else {
context->method_inst = NULL;
+ }
}
-ICALL_EXPORT MonoType*
-ves_icall_System_Reflection_Module_ResolveTypeToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *resolve_error)
+
+static MonoType*
+module_resolve_type_token (MonoImage *image, guint32 token, MonoArrayHandle type_args, MonoArrayHandle method_args, MonoResolveTokenError *resolve_error, MonoError *error)
{
+ HANDLE_FUNCTION_ENTER ();
+ mono_error_init (error);
+ MonoType *result = NULL;
MonoClass *klass;
int table = mono_metadata_token_table (token);
int index = mono_metadata_token_index (token);
MonoGenericContext context;
- MonoError error;
*resolve_error = ResolveTokenError_Other;
if ((table != MONO_TABLE_TYPEDEF) && (table != MONO_TABLE_TYPEREF) &&
(table != MONO_TABLE_TYPESPEC)) {
*resolve_error = ResolveTokenError_BadTable;
- return NULL;
+ goto leave;
}
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, &error);
- mono_error_cleanup (&error);
- return klass ? &klass->byval_arg : NULL;
+ MonoError inner_error;
+ klass = (MonoClass *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL, &inner_error);
+ mono_error_cleanup (&inner_error);
+ result = klass ? &klass->byval_arg : NULL;
+ goto leave;
}
- init_generic_context_from_args (&context, type_args, method_args);
- klass = (MonoClass *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, &context, &error);
- mono_error_cleanup (&error);
- return klass ? &klass->byval_arg : NULL;
+ init_generic_context_from_args_handles (&context, type_args, method_args);
+ MonoError inner_error;
+ klass = (MonoClass *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, &context, &inner_error);
+ mono_error_cleanup (&inner_error);
+ result = klass ? &klass->byval_arg : NULL;
+ goto leave;
}
if ((index <= 0) || (index > image->tables [table].rows)) {
*resolve_error = ResolveTokenError_OutOfRange;
- return NULL;
+ goto leave;
}
- init_generic_context_from_args (&context, type_args, method_args);
- klass = mono_class_get_checked (image, token, &error);
+ init_generic_context_from_args_handles (&context, type_args, method_args);
+ klass = mono_class_get_checked (image, token, error);
if (klass)
- klass = mono_class_inflate_generic_class_checked (klass, &context, &error);
- if (!mono_error_ok (&error)) {
- mono_error_set_pending_exception (&error);
- return NULL;
- }
+ klass = mono_class_inflate_generic_class_checked (klass, &context, error);
+ if (!is_ok (error))
+ goto leave;
if (klass)
- return &klass->byval_arg;
- else
- return NULL;
+ result = &klass->byval_arg;
+leave:
+ HANDLE_FUNCTION_RETURN_VAL (result);
+
+}
+ICALL_EXPORT MonoType*
+ves_icall_System_Reflection_Module_ResolveTypeToken (MonoImage *image, guint32 token, MonoArrayHandle type_args, MonoArrayHandle method_args, MonoResolveTokenError *resolve_error, MonoError *error)
+{
+ return module_resolve_type_token (image, token, type_args, method_args, resolve_error, error);
}
-ICALL_EXPORT MonoMethod*
-ves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *resolve_error)
+static MonoMethod*
+module_resolve_method_token (MonoImage *image, guint32 token, MonoArrayHandle type_args, MonoArrayHandle method_args, MonoResolveTokenError *resolve_error, MonoError *error)
{
- MonoError error;
+ HANDLE_FUNCTION_ENTER ();
+ mono_error_init (error);
+ MonoMethod *method = NULL;
int table = mono_metadata_token_table (token);
int index = mono_metadata_token_index (token);
MonoGenericContext context;
- MonoMethod *method;
*resolve_error = ResolveTokenError_Other;
if ((table != MONO_TABLE_METHOD) && (table != MONO_TABLE_METHODSPEC) &&
(table != MONO_TABLE_MEMBERREF)) {
*resolve_error = ResolveTokenError_BadTable;
- return NULL;
+ goto leave;
}
if (image_is_dynamic (image)) {
if (table == MONO_TABLE_METHOD) {
- method = (MonoMethod *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL, &error);
- mono_error_cleanup (&error);
- return method;
+ MonoError inner_error;
+ method = (MonoMethod *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL, &inner_error);
+ mono_error_cleanup (&inner_error);
+ goto leave;
}
if ((table == MONO_TABLE_MEMBERREF) && !(mono_memberref_is_method (image, token))) {
*resolve_error = ResolveTokenError_BadTable;
- return NULL;
+ goto leave;
}
- init_generic_context_from_args (&context, type_args, method_args);
- method = (MonoMethod *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, &context, &error);
- mono_error_cleanup (&error);
- return method;
+ init_generic_context_from_args_handles (&context, type_args, method_args);
+ MonoError inner_error;
+ method = (MonoMethod *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, &context, &inner_error);
+ mono_error_cleanup (&inner_error);
+ goto leave;
}
if ((index <= 0) || (index > image->tables [table].rows)) {
*resolve_error = ResolveTokenError_OutOfRange;
- return NULL;
+ goto leave;
}
if ((table == MONO_TABLE_MEMBERREF) && (!mono_memberref_is_method (image, token))) {
*resolve_error = ResolveTokenError_BadTable;
- return NULL;
+ goto leave;
}
- init_generic_context_from_args (&context, type_args, method_args);
- method = mono_get_method_checked (image, token, NULL, &context, &error);
- mono_error_set_pending_exception (&error);
+ init_generic_context_from_args_handles (&context, type_args, method_args);
+ method = mono_get_method_checked (image, token, NULL, &context, error);
- return method;
+leave:
+ HANDLE_FUNCTION_RETURN_VAL (method);
+}
+
+ICALL_EXPORT MonoMethod*
+ves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32 token, MonoArrayHandle type_args, MonoArrayHandle method_args, MonoResolveTokenError *resolve_error, MonoError *error)
+{
+ return module_resolve_method_token (image, token, type_args, method_args, resolve_error, error);
}
ICALL_EXPORT MonoString*
return result;
}
-ICALL_EXPORT MonoClassField*
-ves_icall_System_Reflection_Module_ResolveFieldToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *resolve_error)
+static MonoClassField*
+module_resolve_field_token (MonoImage *image, guint32 token, MonoArrayHandle type_args, MonoArrayHandle method_args, MonoResolveTokenError *resolve_error, MonoError *error)
{
- MonoError error;
+ HANDLE_FUNCTION_ENTER ();
MonoClass *klass;
int table = mono_metadata_token_table (token);
int index = mono_metadata_token_index (token);
MonoGenericContext context;
- MonoClassField *field;
+ MonoClassField *field = NULL;
+ mono_error_init (error);
*resolve_error = ResolveTokenError_Other;
/* Validate token */
if ((table != MONO_TABLE_FIELD) && (table != MONO_TABLE_MEMBERREF)) {
*resolve_error = ResolveTokenError_BadTable;
- return NULL;
+ goto leave;
}
if (image_is_dynamic (image)) {
if (table == MONO_TABLE_FIELD) {
- field = (MonoClassField *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL, &error);
- mono_error_cleanup (&error);
- return field;
+ MonoError inner_error;
+ field = (MonoClassField *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL, &inner_error);
+ mono_error_cleanup (&inner_error);
+ goto leave;
}
if (mono_memberref_is_method (image, token)) {
*resolve_error = ResolveTokenError_BadTable;
- return NULL;
+ goto leave;
}
- init_generic_context_from_args (&context, type_args, method_args);
- field = (MonoClassField *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, &context, &error);
- mono_error_cleanup (&error);
- return field;
+ init_generic_context_from_args_handles (&context, type_args, method_args);
+ MonoError inner_error;
+ field = (MonoClassField *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, &context, &inner_error);
+ mono_error_cleanup (&inner_error);
+ goto leave;
}
if ((index <= 0) || (index > image->tables [table].rows)) {
*resolve_error = ResolveTokenError_OutOfRange;
- return NULL;
+ goto leave;
}
if ((table == MONO_TABLE_MEMBERREF) && (mono_memberref_is_method (image, token))) {
*resolve_error = ResolveTokenError_BadTable;
- return NULL;
+ goto leave;
}
- init_generic_context_from_args (&context, type_args, method_args);
- field = mono_field_from_token_checked (image, token, &klass, &context, &error);
- mono_error_set_pending_exception (&error);
+ init_generic_context_from_args_handles (&context, type_args, method_args);
+ field = mono_field_from_token_checked (image, token, &klass, &context, error);
- return field;
+leave:
+ HANDLE_FUNCTION_RETURN_VAL (field);
}
+ICALL_EXPORT MonoClassField*
+ves_icall_System_Reflection_Module_ResolveFieldToken (MonoImage *image, guint32 token, MonoArrayHandle type_args, MonoArrayHandle method_args, MonoResolveTokenError *resolve_error, MonoError *error)
+{
+ return module_resolve_field_token (image, token, type_args, method_args, resolve_error, error);
+}
-ICALL_EXPORT MonoObject*
-ves_icall_System_Reflection_Module_ResolveMemberToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *error)
+ICALL_EXPORT MonoObjectHandle
+ves_icall_System_Reflection_Module_ResolveMemberToken (MonoImage *image, guint32 token, MonoArrayHandle type_args, MonoArrayHandle method_args, MonoResolveTokenError *error, MonoError *merror)
{
- MonoError merror;
- MonoObject *ret;
int table = mono_metadata_token_table (token);
+ mono_error_init (merror);
*error = ResolveTokenError_Other;
switch (table) {
case MONO_TABLE_TYPEDEF:
case MONO_TABLE_TYPEREF:
case MONO_TABLE_TYPESPEC: {
- MonoType *t = ves_icall_System_Reflection_Module_ResolveTypeToken (image, token, type_args, method_args, error);
+ MonoType *t = module_resolve_type_token (image, token, type_args, method_args, error, merror);
if (t) {
- ret = (MonoObject*) mono_type_get_object_checked (mono_domain_get (), t, &merror);
- mono_error_set_pending_exception (&merror);
-
- return ret;
+ return MONO_HANDLE_CAST (MonoObject, mono_type_get_object_handle (mono_domain_get (), t, merror));
}
else
- return NULL;
+ return NULL_HANDLE;
}
case MONO_TABLE_METHOD:
case MONO_TABLE_METHODSPEC: {
- MonoMethod *m = ves_icall_System_Reflection_Module_ResolveMethodToken (image, token, type_args, method_args, error);
+ MonoMethod *m = module_resolve_method_token (image, token, type_args, method_args, error, merror);
if (m) {
- ret = (MonoObject*)mono_method_get_object_checked (mono_domain_get (), m, m->klass, &merror);
- mono_error_set_pending_exception (&merror);
-
- return ret;
+ return MONO_HANDLE_CAST (MonoObject, mono_method_get_object_handle (mono_domain_get (), m, m->klass, merror));
} else
- return NULL;
+ return NULL_HANDLE;
}
case MONO_TABLE_FIELD: {
- MonoClassField *f = ves_icall_System_Reflection_Module_ResolveFieldToken (image, token, type_args, method_args, error);
+ MonoClassField *f = module_resolve_field_token (image, token, type_args, method_args, error, merror);
if (f) {
- ret =(MonoObject*)mono_field_get_object_checked (mono_domain_get (), f->parent, f, &merror);
- mono_error_set_pending_exception (&merror);
- return ret;
+ return MONO_HANDLE_CAST (MonoObject, mono_field_get_object_handle (mono_domain_get (), f->parent, f, merror));
}
else
- return NULL;
+ return NULL_HANDLE;
}
case MONO_TABLE_MEMBERREF:
if (mono_memberref_is_method (image, token)) {
- MonoMethod *m = ves_icall_System_Reflection_Module_ResolveMethodToken (image, token, type_args, method_args, error);
+ MonoMethod *m = module_resolve_method_token (image, token, type_args, method_args, error, merror);
if (m) {
- ret = (MonoObject*)mono_method_get_object_checked (mono_domain_get (), m, m->klass, &merror);
- mono_error_set_pending_exception (&merror);
-
- return ret;
+ return MONO_HANDLE_CAST (MonoObject, mono_method_get_object_handle (mono_domain_get (), m, m->klass, merror));
} else
- return NULL;
+ return NULL_HANDLE;
}
else {
- MonoClassField *f = ves_icall_System_Reflection_Module_ResolveFieldToken (image, token, type_args, method_args, error);
+ MonoClassField *f = module_resolve_field_token (image, token, type_args, method_args, error, merror);
if (f) {
- ret = (MonoObject*)mono_field_get_object_checked (mono_domain_get (), f->parent, f, &merror);
- mono_error_set_pending_exception (&merror);
- return ret;
+ return MONO_HANDLE_CAST (MonoObject, mono_field_get_object_handle (mono_domain_get (), f->parent, f, merror));
}
else
- return NULL;
+ return NULL_HANDLE;
}
break;
*error = ResolveTokenError_BadTable;
}
- return NULL;
+ return NULL_HANDLE;
}
-ICALL_EXPORT MonoArray*
-ves_icall_System_Reflection_Module_ResolveSignature (MonoImage *image, guint32 token, MonoResolveTokenError *resolve_error)
+ICALL_EXPORT MonoArrayHandle
+ves_icall_System_Reflection_Module_ResolveSignature (MonoImage *image, guint32 token, MonoResolveTokenError *resolve_error, MonoError *error)
{
- MonoError error;
+ mono_error_init (error);
int table = mono_metadata_token_table (token);
int idx = mono_metadata_token_index (token);
MonoTableInfo *tables = image->tables;
guint32 sig, len;
const char *ptr;
- MonoArray *res;
*resolve_error = ResolveTokenError_OutOfRange;
/* FIXME: Support other tables ? */
if (table != MONO_TABLE_STANDALONESIG)
- return NULL;
+ return MONO_HANDLE_CAST (MonoArray, NULL);
if (image_is_dynamic (image))
- return NULL;
+ return MONO_HANDLE_CAST (MonoArray, NULL);
if ((idx == 0) || (idx > tables [MONO_TABLE_STANDALONESIG].rows))
- return NULL;
+ return MONO_HANDLE_CAST (MonoArray, NULL);
sig = mono_metadata_decode_row_col (&tables [MONO_TABLE_STANDALONESIG], idx - 1, 0);
ptr = mono_metadata_blob_heap (image, sig);
len = mono_metadata_decode_blob_size (ptr, &ptr);
- res = mono_array_new_checked (mono_domain_get (), mono_defaults.byte_class, len, &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
- memcpy (mono_array_addr (res, guint8, 0), ptr, len);
+ MonoArrayHandle res = mono_array_new_handle (mono_domain_get (), mono_defaults.byte_class, len, error);
+ if (!is_ok (error))
+ return MONO_HANDLE_CAST (MonoArray, NULL);
+ uint32_t h;
+ gpointer array_base = MONO_ARRAY_HANDLE_PIN (res, guint8, 0, &h);
+ memcpy (array_base, ptr, len);
+ mono_gchandle_free (h);
return res;
}
ICALL_EXPORT MonoBoolean
-ves_icall_RuntimeTypeHandle_IsArray (MonoReflectionType *t)
+ves_icall_RuntimeTypeHandle_IsArray (MonoReflectionTypeHandle ref_type, MonoError *error)
{
- MonoType *type;
- MonoBoolean res;
+ mono_error_init (error);
+ MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);
- type = t->type;
- res = !type->byref && (type->type == MONO_TYPE_ARRAY || type->type == MONO_TYPE_SZARRAY);
+ MonoBoolean res = !type->byref && (type->type == MONO_TYPE_ARRAY || type->type == MONO_TYPE_SZARRAY);
return res;
}
mono_class_setup_vtable (klass);
vtable = klass->vtable;
- if (method->klass->flags & TYPE_ATTRIBUTE_INTERFACE) {
+ if (mono_class_is_interface (method->klass)) {
gboolean variance_used = FALSE;
/*MS fails with variant interfaces but it's the right thing to do anyway.*/
int offs = mono_class_interface_offset_with_variance (klass, method->klass, &variance_used);
if (mono_error_set_pending_exception (&error))
return NULL;
- if (MONO_CLASS_IS_INTERFACE (klass) || (klass->flags & TYPE_ATTRIBUTE_ABSTRACT)) {
+ if (MONO_CLASS_IS_INTERFACE (klass) || mono_class_is_abstract (klass)) {
mono_set_pending_exception (mono_get_exception_argument ("type", "Type cannot be instantiated"));
return NULL;
}
return mono_string_new_handle (mono_domain_get (), machine_config, error);
}
-static MonoStringHandle
+ICALL_EXPORT MonoStringHandle
+ves_icall_System_Environment_get_bundled_machine_config (MonoError *error)
+{
+ return get_bundled_machine_config (error);
+}
+
+
+ICALL_EXPORT MonoStringHandle
ves_icall_System_Configuration_DefaultConfig_get_bundled_machine_config (MonoError *error)
{
return get_bundled_machine_config (error);
}
-static MonoStringHandle
+ICALL_EXPORT MonoStringHandle
ves_icall_System_Configuration_InternalConfigurationHost_get_bundled_machine_config (MonoError *error)
{
return get_bundled_machine_config (error);
}
ICALL_EXPORT gboolean
-ves_icall_get_resources_ptr (MonoReflectionAssembly *assembly, gpointer *result, gint32 *size)
+ves_icall_get_resources_ptr (MonoReflectionAssemblyHandle assembly, gpointer *result, gint32 *size, MonoError *error)
{
+ mono_error_init (error);
MonoPEResourceDataEntry *entry;
MonoImage *image;
*result = NULL;
*size = 0;
- image = assembly->assembly->image;
+ MonoAssembly *assm = MONO_HANDLE_GETVAL (assembly, assembly);
+ image = assm->image;
entry = (MonoPEResourceDataEntry *)mono_image_lookup_resource (image, MONO_PE_RESOURCE_ID_ASPNET_STRING, 0, NULL);
if (!entry)
return FALSE;
return m;
klass = method->klass;
- if (klass->generic_class) {
+ if (mono_class_is_ginst (klass)) {
generic_inst = mono_class_get_context (klass);
- klass = klass->generic_class->container_class;
+ klass = mono_class_get_generic_class (klass)->container_class;
}
retry:
return NULL;
}
}
- if (parent->generic_class) {
+ if (mono_class_is_ginst (parent)) {
parent_inst = mono_class_get_context (parent);
- parent = parent->generic_class->container_class;
+ parent = mono_class_get_generic_class (parent)->container_class;
}
mono_class_setup_vtable (parent);
generic_inst = NULL;
}
- if (klass->generic_class) {
+ if (mono_class_is_ginst (klass)) {
generic_inst = mono_class_get_context (klass);
- klass = klass->generic_class->container_class;
+ klass = mono_class_get_generic_class (klass)->container_class;
}
}
*decHexDigits = Formatter_DecHexDigits;
}
+static gboolean
+add_modifier_to_array (MonoDomain *domain, MonoImage *image, MonoCustomMod *modifier, MonoArrayHandle dest, int dest_idx, MonoError *error)
+{
+ HANDLE_FUNCTION_ENTER ();
+ mono_error_init (error);
+ MonoClass *klass = mono_class_get_checked (image, modifier->token, error);
+ if (!is_ok (error))
+ goto leave;
+
+ MonoReflectionTypeHandle rt = mono_type_get_object_handle (domain, &klass->byval_arg, error);
+ if (!is_ok (error))
+ goto leave;
+
+ MONO_HANDLE_ARRAY_SETREF (dest, dest_idx, rt);
+leave:
+ HANDLE_FUNCTION_RETURN_VAL (is_ok (error));
+}
+
/*
* We return NULL for no modifiers so the corlib code can return Type.EmptyTypes
* and avoid useless allocations.
*/
-static MonoArray*
+static MonoArrayHandle
type_array_from_modifiers (MonoImage *image, MonoType *type, int optional, MonoError *error)
{
- MonoReflectionType *rt;
- MonoArray *res;
int i, count = 0;
+ MonoDomain *domain = mono_domain_get ();
mono_error_init (error);
for (i = 0; i < type->num_mods; ++i) {
count++;
}
if (!count)
- return NULL;
- res = mono_array_new_checked (mono_domain_get (), mono_defaults.systemtype_class, count, error);
- return_val_if_nok (error, NULL);
+ return MONO_HANDLE_NEW (MonoArray, NULL);
+
+ MonoArrayHandle res = mono_array_new_handle (domain, mono_defaults.systemtype_class, count, error);
+ if (!is_ok (error))
+ goto fail;
count = 0;
for (i = 0; i < type->num_mods; ++i) {
if ((optional && !type->modifiers [i].required) || (!optional && type->modifiers [i].required)) {
- MonoClass *klass = mono_class_get_checked (image, type->modifiers [i].token, error);
- return_val_if_nok (error, NULL);
-
- rt = mono_type_get_object_checked (mono_domain_get (), &klass->byval_arg, error);
- return_val_if_nok (error, NULL);
-
- mono_array_setref (res, count, rt);
+ if (!add_modifier_to_array (domain, image, &type->modifiers[i], res, count , error))
+ goto fail;
count++;
}
}
return res;
+fail:
+ return MONO_HANDLE_NEW (MonoArray, NULL);
}
-ICALL_EXPORT MonoArray*
-ves_icall_ParameterInfo_GetTypeModifiers (MonoReflectionParameter *param, MonoBoolean optional)
+ICALL_EXPORT MonoArrayHandle
+ves_icall_ParameterInfo_GetTypeModifiers (MonoReflectionParameterHandle param, MonoBoolean optional, MonoError *error)
{
- MonoError error;
- MonoType *type = param->ClassImpl->type;
- MonoClass *member_class = mono_object_class (param->MemberImpl);
+ mono_error_init (error);
+ MonoReflectionTypeHandle rt = MONO_HANDLE_NEW (MonoReflectionType, NULL);
+ MONO_HANDLE_GET (rt, param, ClassImpl);
+ MonoType *type = MONO_HANDLE_GETVAL (rt, type);
+ MonoObjectHandle member = MONO_HANDLE_NEW (MonoObject, NULL);
+ MONO_HANDLE_GET (member, param, MemberImpl);
+ MonoClass *member_class = mono_handle_class (member);
MonoMethod *method = NULL;
MonoImage *image;
int pos;
MonoMethodSignature *sig;
- MonoArray *res;
if (mono_class_is_reflection_method_or_constructor (member_class)) {
- MonoReflectionMethod *rmethod = (MonoReflectionMethod*)param->MemberImpl;
- method = rmethod->method;
+ method = MONO_HANDLE_GETVAL (MONO_HANDLE_CAST (MonoReflectionMethod, member), method);
} else if (member_class->image == mono_defaults.corlib && !strcmp ("MonoProperty", member_class->name)) {
- MonoReflectionProperty *prop = (MonoReflectionProperty *)param->MemberImpl;
- if (!(method = prop->property->get))
- method = prop->property->set;
+ MonoProperty *prop = MONO_HANDLE_GETVAL (MONO_HANDLE_CAST (MonoReflectionProperty, member), property);
+ if (!(method = prop->get))
+ method = prop->set;
g_assert (method);
} else {
char *type_name = mono_type_get_full_name (member_class);
- char *msg = g_strdup_printf ("Custom modifiers on a ParamInfo with member %s are not supported", type_name);
- MonoException *ex = mono_get_exception_not_supported (msg);
+ mono_error_set_not_supported (error, "Custom modifiers on a ParamInfo with member %s are not supported", type_name);
g_free (type_name);
- g_free (msg);
- mono_set_pending_exception (ex);
- return NULL;
+ return MONO_HANDLE_CAST (MonoArray, NULL_HANDLE);
}
image = method->klass->image;
- pos = param->PositionImpl;
+ pos = MONO_HANDLE_GETVAL (param, PositionImpl);
sig = mono_method_signature (method);
if (pos == -1)
type = sig->ret;
else
type = sig->params [pos];
- res = type_array_from_modifiers (image, type, optional, &error);
- mono_error_set_pending_exception (&error);
- return res;
+ return type_array_from_modifiers (image, type, optional, error);
}
static MonoType*
return NULL;
}
-ICALL_EXPORT MonoArray*
-ves_icall_MonoPropertyInfo_GetTypeModifiers (MonoReflectionProperty *property, MonoBoolean optional)
+ICALL_EXPORT MonoArrayHandle
+ves_icall_MonoPropertyInfo_GetTypeModifiers (MonoReflectionPropertyHandle property, MonoBoolean optional, MonoError *error)
{
- MonoError error;
- MonoType *type = get_property_type (property->property);
- MonoImage *image = property->klass->image;
- MonoArray *res;
+ mono_error_init (error);
+ MonoProperty *prop = MONO_HANDLE_GETVAL (property, property);
+ MonoClass *klass = MONO_HANDLE_GETVAL (property, klass);
+ MonoType *type = get_property_type (prop);
+ MonoImage *image = klass->image;
if (!type)
- return NULL;
- res = type_array_from_modifiers (image, type, optional, &error);
- mono_error_set_pending_exception (&error);
- return res;
+ return MONO_HANDLE_CAST (MonoArray, NULL_HANDLE);
+ return type_array_from_modifiers (image, type, optional, error);
}
/*
}
-ICALL_EXPORT MonoString*
-ves_icall_Mono_Runtime_GetDisplayName (void)
+ICALL_EXPORT MonoStringHandle
+ves_icall_Mono_Runtime_GetDisplayName (MonoError *error)
{
char *info;
- MonoString *display_name;
+ MonoStringHandle display_name;
+ mono_error_init (error);
info = mono_get_runtime_callbacks ()->get_runtime_build_info ();
- display_name = mono_string_new (mono_domain_get (), info);
+ display_name = mono_string_new_handle (mono_domain_get (), info, error);
g_free (info);
return display_name;
}
-ICALL_EXPORT MonoString*
-ves_icall_System_ComponentModel_Win32Exception_W32ErrorMessage (guint32 code)
-{
- MonoError error;
- MonoString *message;
- guint32 ret;
- gunichar2 buf[256];
-
- ret = FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS, NULL, code, 0,
- buf, 255, NULL);
- if (ret == 0) {
- message = mono_string_new (mono_domain_get (), "Error looking up error string");
- } else {
- message = mono_string_new_utf16_checked (mono_domain_get (), buf, ret, &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
- }
-
- return message;
-}
-
-ICALL_EXPORT gpointer
-ves_icall_Microsoft_Win32_NativeMethods_GetCurrentProcess (void)
-{
- return GetCurrentProcess ();
-}
-
-ICALL_EXPORT MonoBoolean
-ves_icall_Microsoft_Win32_NativeMethods_GetExitCodeProcess (gpointer handle, gint32 *exitcode)
-{
- return GetExitCodeProcess (handle, (guint32*) exitcode);
-}
-
-#ifndef HOST_WIN32
-static inline MonoBoolean
-mono_icall_close_process (gpointer handle)
-{
- return CloseProcess (handle);
-}
-#endif /* !HOST_WIN32 */
-
-ICALL_EXPORT MonoBoolean
-ves_icall_Microsoft_Win32_NativeMethods_CloseProcess (gpointer handle)
-{
- return mono_icall_close_process (handle);
-}
-
-ICALL_EXPORT MonoBoolean
-ves_icall_Microsoft_Win32_NativeMethods_TerminateProcess (gpointer handle, gint32 exitcode)
-{
- return TerminateProcess (handle, exitcode);
-}
-
#ifndef HOST_WIN32
static inline gint32
mono_icall_wait_for_input_idle (gpointer handle, gint32 milliseconds)
return mono_icall_wait_for_input_idle (handle, milliseconds);
}
-#if G_HAVE_API_SUPPORT(HAVE_CLASSIC_WINAPI_SUPPORT)
-static inline MonoBoolean
-mono_icall_get_process_working_set_size (gpointer handle, gsize *min, gsize *max)
+ICALL_EXPORT gint32
+ves_icall_Microsoft_Win32_NativeMethods_GetCurrentProcessId (void)
{
- return GetProcessWorkingSetSize (handle, min, max);
+ return mono_process_current_pid ();
}
-#endif /* G_HAVE_API_SUPPORT(HAVE_CLASSIC_WINAPI_SUPPORT) */
ICALL_EXPORT MonoBoolean
-ves_icall_Microsoft_Win32_NativeMethods_GetProcessWorkingSetSize (gpointer handle, gsize *min, gsize *max)
+ves_icall_Mono_TlsProviderFactory_IsBtlsSupported (void)
{
- return mono_icall_get_process_working_set_size (handle, min, max);
+#if HAVE_BTLS
+ return TRUE;
+#else
+ return FALSE;
+#endif
}
-#if G_HAVE_API_SUPPORT(HAVE_CLASSIC_WINAPI_SUPPORT)
-static inline MonoBoolean
-mono_icall_set_process_working_set_size (gpointer handle, gsize min, gsize max)
+#ifndef DISABLE_COM
+
+ICALL_EXPORT int
+ves_icall_System_Runtime_InteropServices_Marshal_GetHRForException_WinRT(MonoException* ex)
{
- return SetProcessWorkingSetSize (handle, min, max);
+ mono_set_pending_exception(mono_get_exception_not_implemented("System.Runtime.InteropServices.Marshal.GetHRForException_WinRT internal call is not implemented."));
+ return 0;
}
-#endif /* G_HAVE_API_SUPPORT(HAVE_CLASSIC_WINAPI_SUPPORT) */
-ICALL_EXPORT MonoBoolean
-ves_icall_Microsoft_Win32_NativeMethods_SetProcessWorkingSetSize (gpointer handle, gsize min, gsize max)
+ICALL_EXPORT MonoObject*
+ves_icall_System_Runtime_InteropServices_Marshal_GetNativeActivationFactory(MonoObject* type)
{
- return mono_icall_set_process_working_set_size (handle, min, max);
+ mono_set_pending_exception(mono_get_exception_not_implemented("System.Runtime.InteropServices.Marshal.GetNativeActivationFactory internal call is not implemented."));
+ return NULL;
}
-ICALL_EXPORT MonoBoolean
-ves_icall_Microsoft_Win32_NativeMethods_GetProcessTimes (gpointer handle, gint64 *creationtime, gint64 *exittime, gint64 *kerneltime, gint64 *usertime)
+ICALL_EXPORT void*
+ves_icall_System_Runtime_InteropServices_Marshal_GetRawIUnknownForComObjectNoAddRef(MonoObject* obj)
{
- return GetProcessTimes (handle, (LPFILETIME) creationtime, (LPFILETIME) exittime, (LPFILETIME) kerneltime, (LPFILETIME) usertime);
+ mono_set_pending_exception(mono_get_exception_not_implemented("System.Runtime.InteropServices.Marshal.GetRawIUnknownForComObjectNoAddRef internal call is not implemented."));
+ return NULL;
}
-ICALL_EXPORT gint32
-ves_icall_Microsoft_Win32_NativeMethods_GetCurrentProcessId (void)
+ICALL_EXPORT MonoObject*
+ves_icall_System_Runtime_InteropServices_WindowsRuntime_UnsafeNativeMethods_GetRestrictedErrorInfo()
{
- return mono_process_current_pid ();
+ mono_set_pending_exception(mono_get_exception_not_implemented("System.Runtime.InteropServices.WindowsRuntime.UnsafeNativeMethods.GetRestrictedErrorInfo internal call is not implemented."));
+ return NULL;
}
-#if G_HAVE_API_SUPPORT(HAVE_CLASSIC_WINAPI_SUPPORT)
-static inline gint32
-mono_icall_get_priority_class (gpointer handle)
+ICALL_EXPORT MonoBoolean
+ves_icall_System_Runtime_InteropServices_WindowsRuntime_UnsafeNativeMethods_RoOriginateLanguageException(int error, MonoString* message, void* languageException)
{
- return GetPriorityClass (handle);
+ mono_set_pending_exception(mono_get_exception_not_implemented("System.Runtime.InteropServices.WindowsRuntime.UnsafeNativeMethods.RoOriginateLanguageException internal call is not implemented."));
+ return FALSE;
}
-#endif /* G_HAVE_API_SUPPORT(HAVE_CLASSIC_WINAPI_SUPPORT) */
-ICALL_EXPORT gint32
-ves_icall_Microsoft_Win32_NativeMethods_GetPriorityClass (gpointer handle)
+ICALL_EXPORT void
+ves_icall_System_Runtime_InteropServices_WindowsRuntime_UnsafeNativeMethods_RoReportUnhandledError(MonoObject* error)
{
- return mono_icall_get_priority_class (handle);
+ mono_set_pending_exception(mono_get_exception_not_implemented("System.Runtime.InteropServices.WindowsRuntime.UnsafeNativeMethods.RoReportUnhandledError internal call is not implemented."));
}
-#if G_HAVE_API_SUPPORT(HAVE_CLASSIC_WINAPI_SUPPORT)
-static inline MonoBoolean
-mono_icall_set_priority_class (gpointer handle, gint32 priorityClass)
+ICALL_EXPORT int
+ves_icall_System_Runtime_InteropServices_WindowsRuntime_UnsafeNativeMethods_WindowsCreateString(MonoString* sourceString, int length, void** hstring)
{
- return SetPriorityClass (handle, priorityClass);
+ mono_set_pending_exception(mono_get_exception_not_implemented("System.Runtime.InteropServices.WindowsRuntime.UnsafeNativeMethods.WindowsCreateString internal call is not implemented."));
+ return 0;
}
-#endif /* G_HAVE_API_SUPPORT(HAVE_CLASSIC_WINAPI_SUPPORT) */
-ICALL_EXPORT MonoBoolean
-ves_icall_Microsoft_Win32_NativeMethods_SetPriorityClass (gpointer handle, gint32 priorityClass)
+ICALL_EXPORT int
+ves_icall_System_Runtime_InteropServices_WindowsRuntime_UnsafeNativeMethods_WindowsDeleteString(void* hstring)
{
- return mono_icall_set_priority_class (handle, priorityClass);
+ mono_set_pending_exception(mono_get_exception_not_implemented("System.Runtime.InteropServices.WindowsRuntime.UnsafeNativeMethods.WindowsDeleteString internal call is not implemented."));
+ return 0;
}
-ICALL_EXPORT MonoBoolean
-ves_icall_Mono_Btls_Provider_IsSupported (void)
+ICALL_EXPORT mono_unichar2*
+ves_icall_System_Runtime_InteropServices_WindowsRuntime_UnsafeNativeMethods_WindowsGetStringRawBuffer(void* hstring, unsigned* length)
{
-#if HAVE_BTLS
- return TRUE;
-#else
- return FALSE;
-#endif
+ mono_set_pending_exception(mono_get_exception_not_implemented("System.Runtime.InteropServices.WindowsRuntime.UnsafeNativeMethods.WindowsGetStringRawBuffer internal call is not implemented."));
+ return NULL;
}
+#endif
+
+
#ifndef DISABLE_ICALL_TABLES
#define ICALL_TYPE(id,name,first)