BREAK;
CASE (CEE_LDARGA_S) {
MonoType *t;
+ MonoClass *c;
+
++ip;
t = ARG_TYPE (signature, *ip);
- if (t->type == MONO_TYPE_VALUETYPE) {
+ c = mono_class_from_mono_type (t);
+ sp->data.vt.klass = c;
+ sp->data.vt.vt = ARG_POS (*ip);
+
+ if (c->valuetype)
sp->type = VAL_VALUETA;
- sp->data.vt.vt = ARG_POS (*ip);
- sp->data.vt.klass = t->data.klass;
- } else {
+ else
sp->type = VAL_TP;
- sp->data.p = ARG_POS (*ip);
- sp->data.vt.klass = mono_class_from_mono_type (t);
- }
+
++sp;
++ip;
BREAK;
BREAK;
CASE (CEE_LDLOCA_S) {
MonoType *t;
+ MonoClass *c;
+
++ip;
t = LOCAL_TYPE (header, *ip);
- if (t->type == MONO_TYPE_VALUETYPE) {
+ c = mono_class_from_mono_type (t);
+ sp->data.vt.klass = c;
+ sp->data.p = LOCAL_POS (*ip);
+
+ if (c->valuetype)
sp->type = VAL_VALUETA;
- sp->data.vt.vt = LOCAL_POS (*ip);
- sp->data.vt.klass = t->data.klass;
- } else {
+ else
sp->type = VAL_TP;
- sp->data.p = LOCAL_POS (*ip);
- sp->data.vt.klass = mono_class_from_mono_type (t);
- }
+
++sp;
++ip;
BREAK;
child_frame.method = mono_get_method (image, token, NULL);
csignature = child_frame.method->signature;
g_assert (csignature->call_convention == MONO_CALL_DEFAULT);
-
/* decrement by the actual number of args */
if (csignature->param_count) {
sp -= csignature->param_count;
else if (sp->type == VAL_NATI)
sp->data.p = (gpointer)(~ (int)sp->data.p);
BREAK;
+ CASE (CEE_CONV_U1) // fall through
CASE (CEE_CONV_I1) {
++ip;
switch (sp [-1].type) {
sp [-1].type = VAL_I32;
BREAK;
}
+ CASE (CEE_CONV_U2) // fall through
CASE (CEE_CONV_I2) {
++ip;
switch (sp [-1].type) {
name = mono_metadata_user_string (image, index);
len = mono_metadata_decode_blob_size (name, &name);
- o = mono_new_utf16_string (name, len);
-
+ o = mono_new_utf16_string (name, len >> 1);
sp->type = VAL_OBJ;
sp->data.p = o;
sp->data.vt.klass = NULL;
offset = field->offset - sizeof (MonoObject);
}
if (load_addr) {
- sp->type = VAL_TP;
- sp->data.p = (char*)obj + offset;
- sp->data.vt.klass = mono_class_from_mono_type (field->type);
+ sp [-1].type = VAL_TP;
+ sp [-1].data.p = (char*)obj + offset;
+ sp [-1].data.vt.klass = mono_class_from_mono_type (field->type);
} else {
vt_alloc (field->type, &sp [-1]);
stackval_from_data (field->type, &sp [-1], (char*)obj + offset);
+
}
BREAK;
}
field = mono_class_get_field (sp [0].data.vt.klass, token);
offset = field->offset - sizeof (MonoObject);
}
+
stackval_to_data (field->type, &sp [1], (char*)obj + offset);
vt_free (&sp [1]);
BREAK;
CASE (CEE_UNUSED66)
CASE (CEE_UNUSED67) ves_abort(); BREAK;
CASE (CEE_LDTOKEN)
- CASE (CEE_CONV_U2) ves_abort(); BREAK;
- CASE (CEE_CONV_U1) ves_abort(); BREAK;
//CASE (CEE_CONV_I) ves_abort(); BREAK;
CASE (CEE_CONV_OVF_I) ves_abort(); BREAK;
CASE (CEE_CONV_OVF_U) ves_abort(); BREAK;
++ip;
switch (*ip) {
case CEE_ARGLIST: ves_abort(); break;
- case CEE_CEQ: ves_abort(); break;
+ case CEE_CEQ: {
+ gint32 result;
+ ++ip;
+ sp -= 2;
+
+ if (sp->type == VAL_I32)
+ result = sp [0].data.i == GET_NATI (sp [1]);
+ else if (sp->type == VAL_I64)
+ result = sp [0].data.l == sp [1].data.l;
+ else if (sp->type == VAL_DOUBLE)
+ result = sp [0].data.f == sp [1].data.f;
+ else
+ result = GET_NATI (sp [0]) == GET_NATI (sp [1]);
+ sp->type = VAL_I32;
+ sp->data.i = result;
+
+ sp++;
+
+ break;
+ }
case CEE_CGT: ves_abort(); break;
case CEE_CGT_UN: ves_abort(); break;
case CEE_CLT: ves_abort(); break;
}
case CEE_LDLOCA: {
MonoType *t;
+ MonoClass *c;
guint32 loc_pos;
+
++ip;
loc_pos = read32 (ip);
ip += 4;
t = LOCAL_TYPE (header, loc_pos);
- if (t->type == MONO_TYPE_VALUETYPE) {
+ c = mono_class_from_mono_type (t);
+ sp->data.vt.vt = LOCAL_POS (loc_pos);
+ sp->data.vt.klass = c;
+
+ if (c->valuetype)
sp->type = VAL_VALUETA;
- sp->data.vt.vt = LOCAL_POS (loc_pos);
- sp->data.vt.klass = t->data.klass;
- } else {
+ else
sp->type = VAL_TP;
- sp->data.p = LOCAL_POS (loc_pos);
- sp->data.vt.klass = mono_class_from_mono_type (t);
- }
+
++sp;
break;
}
if (class->metadata_inited)
return;
- if (class->parent && !class->parent->metadata_inited)
- mono_class_metadata_init (class->parent);
+ if (class->parent) {
+ if (!class->parent->metadata_inited)
+ mono_class_metadata_init (class->parent);
+ class->instance_size = class->parent->instance_size;
+ class->class_size = class->parent->class_size;
+ }
class->metadata_inited = 1;
-
/*
* Computes the size used by the fields, and their locations
*/
class->type_token = type_token;
class->flags = cols [0];
-
/*g_print ("Init class %s\n", name);*/
/* if root of the hierarchy */
if (!strcmp (nspace, "System") && !strcmp (name, "Object")) {
- class->instance_size = sizeof (MonoObject);
class->parent = NULL;
+ class->instance_size = sizeof (MonoObject);
} else if (!(cols [0] & TYPE_ATTRIBUTE_INTERFACE)) {
parent_token = mono_metadata_token_from_dor (cols [3]);
class->parent = mono_class_get (image, parent_token);
- class->instance_size = class->parent->instance_size;
class->valuetype = class->parent->valuetype;
class->enumtype = class->parent->enumtype;
- g_assert (class->instance_size);
}
if (!strcmp (nspace, "System")) {
if (!strcmp (nspace, "System") && !strcmp (name, "Array")) {
class->instance_size += 2 * sizeof (gpointer);
g_assert (class->field.count == 0);
- g_assert (class->instance_size == sizeof (MonoArrayObject));
}
class->interfaces = mono_metadata_interfaces_from_typedef (image, type_token);