return t.ToString ();
}
+ enum AnEnum {
+ One
+ };
+
public static int test_0_constrained_tostring () {
if (to_string<int, int> (1, 1) != "1")
return 1;
- if (to_string<string, int> ("A", 1) != "A")
+ if (to_string<AnEnum, int> (AnEnum.One, 1) != "One")
return 2;
+ if (to_string<string, int> ("A", 1) != "A")
+ return 3;
return 0;
}
return 1;
if (get_hash<double, int> (1.0, 1) != 1.0.GetHashCode ())
return 2;
- if (get_hash<string, int> ("A", 1) != "A".GetHashCode ())
+ if (get_hash<AnEnum, int> (AnEnum.One, 1) != AnEnum.One.GetHashCode ())
return 3;
+ if (get_hash<string, int> ("A", 1) != "A".GetHashCode ())
+ return 4;
return 0;
}
return 1;
if (equals<double, int> (1.0, 1) != true)
return 2;
- if (equals<string, int> ("A", 1) != true)
+ if (equals<AnEnum, int> (AnEnum.One, 1) != true)
return 3;
+ if (equals<string, int> ("A", 1) != true)
+ return 4;
return 0;
}
return mono_compile_method (m);
}
-MonoObject*
-mono_object_tostring_gsharedvt (gpointer mp, MonoMethod *cmethod, MonoClass *klass)
+static MonoMethod*
+constrained_gsharedvt_call_setup (gpointer mp, MonoMethod *cmethod, MonoClass *klass, gpointer *this_arg)
{
MonoMethod *m;
int vt_slot;
- gpointer this_arg;
/* Lookup the virtual method */
mono_class_setup_vtable (klass);
g_assert (klass->vtable);
vt_slot = mono_method_get_vtable_slot (cmethod);
m = klass->vtable [vt_slot];
- if (klass->valuetype)
- this_arg = mp;
+ if (klass->valuetype && (m->klass == mono_defaults.object_class || m->klass == mono_defaults.enum_class->parent || m->klass == mono_defaults.enum_class))
+ *this_arg = mono_value_box (mono_domain_get (), klass, mp);
+ else if (klass->valuetype)
+ *this_arg = mp;
else
- this_arg = *(gpointer*)mp;
+ *this_arg = *(gpointer*)mp;
+ return m;
+}
+
+MonoObject*
+mono_object_tostring_gsharedvt (gpointer mp, MonoMethod *cmethod, MonoClass *klass)
+{
+ MonoMethod *m;
+ gpointer this_arg;
+
+ m = constrained_gsharedvt_call_setup (mp, cmethod, klass, &this_arg);
return mono_runtime_invoke (m, this_arg, NULL, NULL);
}
mono_object_gethashcode_gsharedvt (gpointer mp, MonoMethod *cmethod, MonoClass *klass)
{
MonoMethod *m;
- int vt_slot;
gpointer this_arg;
MonoObject *res;
gpointer p;
- /* Lookup the virtual method */
- mono_class_setup_vtable (klass);
- g_assert (klass->vtable);
- vt_slot = mono_method_get_vtable_slot (cmethod);
- m = klass->vtable [vt_slot];
- if (klass->valuetype)
- this_arg = mp;
- else
- this_arg = *(gpointer*)mp;
+ m = constrained_gsharedvt_call_setup (mp, cmethod, klass, &this_arg);
// FIXME: This boxes the result
res = mono_runtime_invoke (m, this_arg, NULL, NULL);
p = mono_object_unbox (res);
mono_object_equals_gsharedvt (gpointer mp, MonoMethod *cmethod, MonoClass *klass, MonoObject *arg)
{
MonoMethod *m;
- int vt_slot;
gpointer this_arg;
MonoObject *res;
gpointer p;
void **args;
- /* Lookup the virtual method */
- mono_class_setup_vtable (klass);
- g_assert (klass->vtable);
- vt_slot = mono_method_get_vtable_slot (cmethod);
- m = klass->vtable [vt_slot];
- if (klass->valuetype)
- this_arg = mp;
- else
- this_arg = *(gpointer*)mp;
+ m = constrained_gsharedvt_call_setup (mp, cmethod, klass, &this_arg);
// FIXME: This boxes the result
args = (void**)&arg;
res = mono_runtime_invoke (m, this_arg, args, NULL);