}
}
+static MonoClassField *
+interp_field_from_token (MonoMethod *method, guint32 token, MonoClass **klass, MonoGenericContext *generic_context)
+{
+ MonoClassField *field = NULL;
+ if (method->wrapper_type != MONO_WRAPPER_NONE) {
+ field = (MonoClassField *) mono_method_get_wrapper_data (method, token);
+ *klass = field->parent;
+ } else {
+ MonoError error;
+ error_init (&error);
+ field = mono_field_from_token_checked (method->klass->image, token, klass, generic_context, &error);
+ mono_error_cleanup (&error); /* FIXME: don't swallow the error */
+ }
+ return field;
+}
+
static void
generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, MonoGenericContext *generic_context)
{
case CEE_CASTCLASS:
CHECK_STACK (&td, 1);
token = read32 (td.ip + 1);
- klass = mono_class_get_full (image, token, generic_context);
+ klass = mini_get_class (method, token, generic_context);
ADD_CODE(&td, MINT_CASTCLASS);
ADD_CODE(&td, get_data_item_index (&td, klass));
td.sp [-1].klass = klass;
case CEE_ISINST:
CHECK_STACK (&td, 1);
token = read32 (td.ip + 1);
- klass = mono_class_get_full (image, token, generic_context);
+ klass = mini_get_class (method, token, generic_context);
ADD_CODE(&td, MINT_ISINST);
ADD_CODE(&td, get_data_item_index (&td, klass));
td.ip += 5;
CHECK_STACK (&td, 1);
token = read32 (td.ip + 1);
- g_assert (method->wrapper_type == MONO_WRAPPER_NONE);
- klass = mono_class_get_full (image, token, generic_context);
+ klass = mini_get_class (method, token, generic_context);
if (mini_type_is_reference (&klass->byval_arg)) {
+ int mt = mint_type (&klass->byval_arg);
ADD_CODE (&td, MINT_CASTCLASS);
ADD_CODE (&td, get_data_item_index (&td, klass));
SET_TYPE (td.sp - 1, stack_type [mt], klass);
case CEE_LDFLDA:
CHECK_STACK (&td, 1);
token = read32 (td.ip + 1);
- field = mono_field_from_token (image, token, &klass, generic_context);
+ field = interp_field_from_token (method, token, &klass, generic_context);
gboolean is_static = !!(field->type->attrs & FIELD_ATTRIBUTE_STATIC);
mono_class_init (klass);
if (is_static) {
case CEE_LDFLD: {
CHECK_STACK (&td, 1);
token = read32 (td.ip + 1);
- field = mono_field_from_token (image, token, &klass, generic_context);
+ field = interp_field_from_token (method, token, &klass, generic_context);
gboolean is_static = !!(field->type->attrs & FIELD_ATTRIBUTE_STATIC);
mono_class_init (klass);
case CEE_STFLD: {
CHECK_STACK (&td, 2);
token = read32 (td.ip + 1);
- field = mono_field_from_token (image, token, &klass, generic_context);
+ field = interp_field_from_token (method, token, &klass, generic_context);
gboolean is_static = !!(field->type->attrs & FIELD_ATTRIBUTE_STATIC);
mono_class_init (klass);
mt = mint_type(field->type);
}
case CEE_LDSFLDA:
token = read32 (td.ip + 1);
- field = mono_field_from_token (image, token, &klass, generic_context);
+ field = interp_field_from_token (method, token, &klass, generic_context);
ADD_CODE(&td, MINT_LDSFLDA);
ADD_CODE(&td, get_data_item_index (&td, field));
td.ip += 5;
break;
case CEE_LDSFLD:
token = read32 (td.ip + 1);
- field = mono_field_from_token (image, token, &klass, generic_context);
+ field = interp_field_from_token (method, token, &klass, generic_context);
mt = mint_type(field->type);
ADD_CODE(&td, mt == MINT_TYPE_VT ? MINT_LDSFLD_VT : MINT_LDSFLD);
ADD_CODE(&td, get_data_item_index (&td, field));
case CEE_STSFLD:
CHECK_STACK (&td, 1);
token = read32 (td.ip + 1);
- field = mono_field_from_token (image, token, &klass, generic_context);
+ field = interp_field_from_token (method, token, &klass, generic_context);
mt = mint_type(field->type);
ADD_CODE(&td, mt == MINT_TYPE_VT ? MINT_STSFLD_VT : MINT_STSFLD);
ADD_CODE(&td, get_data_item_index (&td, field));
if (method->wrapper_type != MONO_WRAPPER_NONE)
klass = (MonoClass *)mono_method_get_wrapper_data (method, token);
else
- klass = mono_class_get_full (image, token, generic_context);
+ klass = mini_get_class (method, token, generic_context);
ADD_CODE(&td, td.sp [-1].type == STACK_TYPE_VT ? MINT_STOBJ_VT : MINT_STOBJ);
ADD_CODE(&td, get_data_item_index (&td, klass));
if (method->wrapper_type != MONO_WRAPPER_NONE)
klass = (MonoClass *)mono_method_get_wrapper_data (method, token);
else
- klass = mono_class_get_full (image, token, generic_context);
+ klass = mini_get_class (method, token, generic_context);
if (mono_class_is_nullable (klass)) {
MonoMethod *target_method = mono_class_get_method_from_name (klass, "Box", 1);
if (method->wrapper_type != MONO_WRAPPER_NONE)
klass = (MonoClass *)mono_method_get_wrapper_data (method, token);
else
- klass = mono_class_get_full (image, token, generic_context);
+ klass = mini_get_class (method, token, generic_context);
unsigned char lentype = (td.sp - 1)->type;
if (lentype == STACK_TYPE_I8) {
if (method->wrapper_type != MONO_WRAPPER_NONE)
klass = (MonoClass *) mono_method_get_wrapper_data (method, token);
else
- klass = mono_class_get_full (image, token, generic_context);
+ klass = mini_get_class (method, token, generic_context);
if (!klass->valuetype && method->wrapper_type == MONO_WRAPPER_NONE && !readonly) {
ADD_CODE (&td, MINT_LDELEMA_TC);
case CEE_LDELEM:
CHECK_STACK (&td, 2);
token = read32 (td.ip + 1);
- klass = mono_class_get_full (image, token, generic_context);
+ klass = mini_get_class (method, token, generic_context);
switch (mint_type (&klass->byval_arg)) {
case MINT_TYPE_I1:
ENSURE_I4 (&td, 1);
CHECK_STACK (&td, 3);
ENSURE_I4 (&td, 2);
token = read32 (td.ip + 1);
- klass = mono_class_get_full (image, token, generic_context);
+ klass = mini_get_class (method, token, generic_context);
switch (mint_type (&klass->byval_arg)) {
case MINT_TYPE_U1:
SIMPLE_OP (td, MINT_STELEM_U1);
case CEE_INITOBJ:
CHECK_STACK(&td, 1);
token = read32 (td.ip + 1);
- klass = mono_class_get_full (image, token, generic_context);
+ klass = mini_get_class (method, token, generic_context);
if (klass->valuetype) {
ADD_CODE (&td, MINT_INITOBJ);
i32 = mono_class_value_size (klass, NULL);
break;
case CEE_CONSTRAINED_:
token = read32 (td.ip + 1);
- constrained_class = mono_class_get_full (image, token, generic_context);
+ constrained_class = mini_get_class (method, token, generic_context);
mono_class_init (constrained_class);
td.ip += 5;
break;
size = mono_type_size (type, &align);
} else {
int align;
- MonoClass *szclass = mono_class_get_full (image, token, generic_context);
+ MonoClass *szclass = mini_get_class (method, token, generic_context);
mono_class_init (szclass);
#if 0
if (!szclass->valuetype)
break;
case MonoInlineType:
if (method->wrapper_type == MONO_WRAPPER_NONE) {
- class = mono_class_get_full (image, read32 (ip + 1), generic_context);
+ class = mini_get_class (method, read32 (ip + 1), generic_context);
mono_class_init (class);
/* quick fix to not do this for the fake ptr classes - probably should not be getting the vtable at all here */
#if 0