v = s.InvokeMethod (e.Thread, m, null);
AssertValue (42, v);
+ // .ctor
+ s = frame.GetArgument (1) as StructMirror;
+ t = s.Type;
+ m = t.GetMethods ().First (method => method.Name == ".ctor" && method.GetParameters ().Length == 1);
+ v = t.InvokeMethod (e.Thread, m, new Value [] { vm.CreateValue (1) });
+ AssertValue (1, (v as StructMirror)["i"]);
+
#if NET_4_5
// Invoke a method which changes state
s = frame.GetArgument (1) as StructMirror;
return ERR_INVALID_ARGUMENT;
}
memset (this_buf, 0, mono_class_instance_size (m->klass));
+ } else if (m->klass->valuetype && !strcmp (m->name, ".ctor")) {
+ /* Could be null */
+ guint8 *tmp_p;
+
+ int type = decode_byte (p, &tmp_p, end);
+ if (type == VALUE_TYPE_ID_NULL) {
+ memset (this_buf, 0, mono_class_instance_size (m->klass));
+ p = tmp_p;
+ } else {
+ err = decode_value (&m->klass->byval_arg, domain, this_buf, p, &p, end);
+ if (err)
+ return err;
+ }
} else {
err = decode_value (&m->klass->byval_arg, domain, this_buf, p, &p, end);
if (err)
out_args = TRUE;
buffer_add_byte (buf, 1 + (out_this ? 2 : 0) + (out_args ? 4 : 0));
if (sig->ret->type == MONO_TYPE_VOID) {
- if (!strcmp (m->name, ".ctor") && !m->klass->valuetype) {
- buffer_add_value (buf, &mono_defaults.object_class->byval_arg, &this, domain);
- }
- else
+ if (!strcmp (m->name, ".ctor")) {
+ if (!m->klass->valuetype)
+ buffer_add_value (buf, &mono_defaults.object_class->byval_arg, &this, domain);
+ else
+ buffer_add_value (buf, &m->klass->byval_arg, this_buf, domain);
+ } else {
buffer_add_value (buf, &mono_defaults.void_class->byval_arg, NULL, domain);
+ }
} else if (MONO_TYPE_IS_REFERENCE (sig->ret)) {
buffer_add_value (buf, sig->ret, &res, domain);
} else if (mono_class_from_mono_type (sig->ret)->valuetype || sig->ret->type == MONO_TYPE_PTR || sig->ret->type == MONO_TYPE_FNPTR) {