+static MonoArray*
+ves_icall_Type_GetGenericArguments (MonoReflectionType *type)
+{
+ MonoArray *res;
+ MonoClass *klass, *pklass;
+ int i;
+ MONO_ARCH_SAVE_REGS;
+
+ klass = mono_class_from_mono_type (type->type);
+
+ if (type->type->byref) {
+ res = mono_array_new (mono_object_domain (type), mono_defaults.monotype_class, 0);
+ } else if (klass->gen_params) {
+ res = mono_array_new (mono_object_domain (type), mono_defaults.monotype_class, klass->num_gen_params);
+ for (i = 0; i < klass->num_gen_params; ++i) {
+ pklass = mono_class_from_generic_parameter (&klass->gen_params [i], klass->image, FALSE);
+ mono_array_set (res, gpointer, i, mono_type_get_object (mono_object_domain (type), &pklass->byval_arg));
+ }
+ } else if (klass->generic_inst) {
+ MonoGenericInst *inst = klass->generic_inst->data.generic_inst;
+ res = mono_array_new (mono_object_domain (type), mono_defaults.monotype_class, inst->type_argc);
+ for (i = 0; i < inst->type_argc; ++i) {
+ mono_array_set (res, gpointer, i, mono_type_get_object (mono_object_domain (type), inst->type_argv [i]));
+ }
+ } else {
+ res = mono_array_new (mono_object_domain (type), mono_defaults.monotype_class, 0);
+ }
+ return res;
+}
+
+static gboolean
+ves_icall_Type_get_IsGenericTypeDefinition (MonoReflectionType *type)
+{
+ MonoClass *klass;
+ MONO_ARCH_SAVE_REGS;
+
+ if (type->type->byref)
+ return FALSE;
+ klass = mono_class_from_mono_type (type->type);
+
+ return klass->gen_params != NULL;
+}
+
+static MonoReflectionType*
+ves_icall_Type_GetGenericTypeDefinition_impl (MonoReflectionType *type)
+{
+ MonoClass *klass;
+ MONO_ARCH_SAVE_REGS;
+
+ if (type->type->byref)
+ return NULL;
+ klass = mono_class_from_mono_type (type->type);
+ if (klass->gen_params) {
+ return type; /* check this one */
+ }
+ if (klass->generic_inst) {
+ MonoType *generic_type = klass->generic_inst->data.generic_inst->generic_type;
+ MonoClass *generic_class = mono_class_from_mono_type (generic_type);
+
+ if (generic_class->wastypebuilder && generic_class->reflection_info)
+ return generic_class->reflection_info;
+ else
+ return mono_type_get_object (mono_object_domain (type), generic_type);
+ }
+ return NULL;
+}
+
+static MonoReflectionType*
+ves_icall_Type_BindGenericParameters (MonoReflectionType *type, MonoArray *types)
+{
+ MonoClass *klass;
+ MONO_ARCH_SAVE_REGS;
+
+ if (type->type->byref)
+ return NULL;
+
+ klass = mono_reflection_bind_generic_parameters (type, types);
+
+ return mono_type_get_object (mono_object_domain (type), klass->generic_inst);
+}
+
+static gboolean
+ves_icall_Type_get_IsGenericInstance (MonoReflectionType *type)
+{
+ MonoClass *klass;
+ MONO_ARCH_SAVE_REGS;
+
+ if (type->type->byref)
+ return FALSE;
+ klass = mono_class_from_mono_type (type->type);
+ return klass->generic_inst != NULL;
+}
+
+static gint32
+ves_icall_Type_GetGenericParameterPosition (MonoReflectionType *type)
+{
+ MONO_ARCH_SAVE_REGS;
+
+ if (type->type->byref)
+ return -1;
+ if (type->type->type == MONO_TYPE_VAR || type->type->type == MONO_TYPE_MVAR)
+ return type->type->data.generic_param->num;
+ return -1;
+}
+
+static MonoBoolean
+ves_icall_MonoType_get_HasGenericArguments (MonoReflectionType *type)
+{
+ MonoClass *klass;
+ MONO_ARCH_SAVE_REGS;
+
+ if (type->type->byref)
+ return FALSE;
+ klass = mono_class_from_mono_type (type->type);
+ if (klass->gen_params || klass->generic_inst)
+ return TRUE;
+ return FALSE;
+}
+
+static MonoBoolean
+ves_icall_MonoType_get_IsGenericParameter (MonoReflectionType *type)
+{
+ MONO_ARCH_SAVE_REGS;
+
+ if (type->type->byref)
+ return FALSE;
+ if (type->type->type == MONO_TYPE_VAR || type->type->type == MONO_TYPE_MVAR)
+ return TRUE;
+ return FALSE;
+}
+
+static MonoBoolean
+ves_icall_TypeBuilder_get_IsGenericParameter (MonoReflectionTypeBuilder *tb)
+{
+ MONO_ARCH_SAVE_REGS;
+
+ if (tb->type.type->byref)
+ return FALSE;
+ if (tb->type.type->type == MONO_TYPE_VAR || tb->type.type->type == MONO_TYPE_MVAR)
+ return TRUE;
+ return FALSE;
+}
+
+static MonoReflectionType*
+ves_icall_TypeBuilder_define_generic_parameter (MonoReflectionTypeBuilder *tb, MonoReflectionGenericParam *gparam)
+{
+ guint32 index;
+
+ MONO_ARCH_SAVE_REGS;
+
+ index = mono_array_length (tb->generic_params) - 1;
+ return mono_reflection_define_generic_parameter (tb, NULL, index, gparam);
+}
+
+static MonoReflectionType*
+ves_icall_MethodBuilder_define_generic_parameter (MonoReflectionMethodBuilder *mb, MonoReflectionGenericParam *gparam)
+{
+ guint32 index;
+
+ MONO_ARCH_SAVE_REGS;
+
+ index = mono_array_length (mb->generic_params) - 1;
+ return mono_reflection_define_generic_parameter (NULL, mb, index, gparam);
+}
+
+static MonoReflectionMethod *
+ves_icall_MonoType_get_DeclaringMethod (MonoReflectionType *type)
+{
+ MonoMethod *method;
+ MonoClass *klass;
+
+ MONO_ARCH_SAVE_REGS;
+
+ if (type->type->byref)
+ return FALSE;
+
+ method = type->type->data.generic_param->method;
+ if (!method)
+ return NULL;
+
+ klass = mono_class_from_mono_type (type->type);
+ return mono_method_get_object (mono_object_domain (type), method, klass);
+}
+
+