X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fmarshal.c;h=57a01980dd3fe56a603a0dd91002350e1cfd2cd8;hb=6c99777888b24fd3728aefd30e001b3b9dde149b;hp=0d304be5080788c3d42ef445c28cec9112dc43fb;hpb=b608a0d95101d7be3a9f16155cd9a5d2e31a82ac;p=mono.git diff --git a/mono/metadata/marshal.c b/mono/metadata/marshal.c index 0d304be5080..57a01980dd3 100644 --- a/mono/metadata/marshal.c +++ b/mono/metadata/marshal.c @@ -137,6 +137,9 @@ mono_marshal_xdomain_copy_out_value (MonoObject *src, MonoObject *dst); static gint32 mono_marshal_set_domain_by_id (gint32 id, MonoBoolean push); +static gboolean +mono_marshal_check_domain_image (gint32 domain_id, MonoImage *image); + void mono_upgrade_remote_class_wrapper (MonoReflectionType *rtype, MonoTransparentProxy *tproxy); @@ -389,6 +392,7 @@ mono_marshal_init (void) register_icall (mono_marshal_xdomain_copy_value, "mono_marshal_xdomain_copy_value", "object object", FALSE); register_icall (mono_marshal_xdomain_copy_out_value, "mono_marshal_xdomain_copy_out_value", "void object object", FALSE); register_icall (mono_marshal_set_domain_by_id, "mono_marshal_set_domain_by_id", "int32 int32 int32", FALSE); + register_icall (mono_marshal_check_domain_image, "mono_marshal_check_domain_image", "int32 int32 ptr", FALSE); register_icall (mono_compile_method, "mono_compile_method", "ptr ptr", FALSE); register_icall (mono_context_get, "mono_context_get", "object", FALSE); register_icall (mono_context_set, "mono_context_set", "void object", FALSE); @@ -1135,14 +1139,19 @@ mono_mb_emit_i2 (MonoMethodBuilder *mb, gint16 data) mb->pos += 2; } +static inline void +mono_mb_emit_op (MonoMethodBuilder *mb, guint8 op, gpointer data) +{ + mono_mb_emit_byte (mb, op); + mono_mb_emit_i4 (mb, mono_mb_add_data (mb, data)); +} + void mono_mb_emit_ldstr (MonoMethodBuilder *mb, char *str) { - mono_mb_emit_byte (mb, CEE_LDSTR); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, str)); + mono_mb_emit_op (mb, CEE_LDSTR, str); } - void mono_mb_emit_ldarg (MonoMethodBuilder *mb, guint argnum) { @@ -1265,22 +1274,19 @@ static void mono_mb_emit_ptr (MonoMethodBuilder *mb, gpointer ptr) { mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_LDPTR); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, ptr)); + mono_mb_emit_op (mb, CEE_MONO_LDPTR, ptr); } static void mono_mb_emit_calli (MonoMethodBuilder *mb, MonoMethodSignature *sig) { - mono_mb_emit_byte (mb, CEE_CALLI); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, sig)); + mono_mb_emit_op (mb, CEE_CALLI, sig); } void mono_mb_emit_managed_call (MonoMethodBuilder *mb, MonoMethod *method, MonoMethodSignature *opt_sig) { - mono_mb_emit_byte (mb, CEE_CALL); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, method)); + mono_mb_emit_op (mb, CEE_CALL, method); } void @@ -1298,8 +1304,7 @@ static void mono_mb_emit_icall (MonoMethodBuilder *mb, gpointer func) { mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_ICALL); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, func)); + mono_mb_emit_op (mb, CEE_MONO_ICALL, func); } static void @@ -1326,8 +1331,7 @@ mono_mb_emit_exception_full (MonoMethodBuilder *mb, const char *exc_nspace, cons mono_class_init (mme); ctor = mono_class_get_method_from_name (mme, ".ctor", 0); g_assert (ctor); - mono_mb_emit_byte (mb, CEE_NEWOBJ); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, ctor)); + mono_mb_emit_op (mb, CEE_NEWOBJ, ctor); if (msg != NULL) { mono_mb_emit_byte (mb, CEE_DUP); mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoException, message)); @@ -1512,8 +1516,7 @@ emit_ptr_to_object_conv (MonoMethodBuilder *mb, MonoType *type, MonoMarshalConv /* create a new array */ mono_mb_emit_ldloc (mb, 1); mono_mb_emit_icon (mb, mspec->data.array_data.num_elem); - mono_mb_emit_byte (mb, CEE_NEWARR); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, eklass)); + mono_mb_emit_op (mb, CEE_NEWARR, eklass); mono_mb_emit_byte (mb, CEE_STIND_I); if (eklass->blittable) { @@ -1564,8 +1567,7 @@ emit_ptr_to_object_conv (MonoMethodBuilder *mb, MonoType *type, MonoMarshalConv /* Set dst */ mono_mb_emit_ldloc (mb, array_var); mono_mb_emit_ldloc (mb, index_var); - mono_mb_emit_byte (mb, CEE_LDELEMA); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, eklass)); + mono_mb_emit_op (mb, CEE_LDELEMA, eklass); mono_mb_emit_stloc (mb, 1); /* Do the conversion */ @@ -1594,8 +1596,7 @@ emit_ptr_to_object_conv (MonoMethodBuilder *mb, MonoType *type, MonoMarshalConv /* create a new array */ mono_mb_emit_ldloc (mb, 1); mono_mb_emit_icon (mb, mspec->data.array_data.num_elem); - mono_mb_emit_byte (mb, CEE_NEWARR); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, eclass)); + mono_mb_emit_op (mb, CEE_NEWARR, eclass); mono_mb_emit_byte (mb, CEE_STIND_REF); mono_mb_emit_ldloc (mb, 1); @@ -1643,8 +1644,7 @@ emit_ptr_to_object_conv (MonoMethodBuilder *mb, MonoType *type, MonoMarshalConv /* *dst = new object */ mono_mb_emit_ldloc (mb, 1); mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_NEWOBJ); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, klass)); + mono_mb_emit_op (mb, CEE_MONO_NEWOBJ, klass); mono_mb_emit_byte (mb, CEE_STIND_REF); /* save the old src pointer */ @@ -1676,8 +1676,7 @@ emit_ptr_to_object_conv (MonoMethodBuilder *mb, MonoType *type, MonoMarshalConv mono_mb_emit_ldloc (mb, 1); mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_CLASSCONST); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, klass)); + mono_mb_emit_op (mb, CEE_MONO_CLASSCONST, klass); mono_mb_emit_ldloc (mb, 0); mono_mb_emit_byte (mb, CEE_LDIND_I); mono_mb_emit_icall (mb, mono_ftnptr_to_delegate); @@ -1833,10 +1832,7 @@ emit_object_to_ptr_conv (MonoMethodBuilder *mb, MonoType *type, MonoMarshalConv mono_mb_emit_ldloc (mb, 1); mono_mb_emit_ldloc (mb, 0); mono_mb_emit_byte (mb, CEE_LDIND_REF); - mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_OBJADDR); - mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoArray, vector)); - mono_mb_emit_byte (mb, CEE_ADD); + mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoArray, vector)); mono_mb_emit_icon (mb, mspec->data.array_data.num_elem * esize); mono_mb_emit_byte (mb, CEE_PREFIX1); mono_mb_emit_byte (mb, CEE_CPBLK); @@ -1875,8 +1871,7 @@ emit_object_to_ptr_conv (MonoMethodBuilder *mb, MonoType *type, MonoMarshalConv /* Set src */ mono_mb_emit_ldloc (mb, array_var); mono_mb_emit_ldloc (mb, index_var); - mono_mb_emit_byte (mb, CEE_LDELEMA); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, eklass)); + mono_mb_emit_op (mb, CEE_LDELEMA, eklass); mono_mb_emit_stloc (mb, 0); /* dst is already set */ @@ -2136,8 +2131,7 @@ emit_struct_free (MonoMethodBuilder *mb, MonoClass *klass, int struct_var) /* Call DestroyStructure */ /* FIXME: Only do this if needed */ mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_CLASSCONST); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, klass)); + mono_mb_emit_op (mb, CEE_MONO_CLASSCONST, klass); mono_mb_emit_ldloc (mb, struct_var); mono_mb_emit_icall (mb, mono_struct_delete_old); } @@ -2684,8 +2678,7 @@ mono_mb_emit_restore_result (MonoMethodBuilder *mb, MonoType *return_type) case MONO_TYPE_I8: case MONO_TYPE_R4: case MONO_TYPE_R8: - mono_mb_emit_byte (mb, CEE_UNBOX); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, mono_class_from_mono_type (return_type))); + mono_mb_emit_op (mb, CEE_UNBOX, mono_class_from_mono_type (return_type)); mono_mb_emit_byte (mb, mono_type_to_ldind (return_type)); break; case MONO_TYPE_GENERICINST: @@ -2693,12 +2686,9 @@ mono_mb_emit_restore_result (MonoMethodBuilder *mb, MonoType *return_type) break; /* fall through */ case MONO_TYPE_VALUETYPE: { - int class; - mono_mb_emit_byte (mb, CEE_UNBOX); - class = mono_mb_add_data (mb, mono_class_from_mono_type (return_type)); - mono_mb_emit_i4 (mb, class); - mono_mb_emit_byte (mb, CEE_LDOBJ); - mono_mb_emit_i4 (mb, class); + MonoClass *klass = mono_class_from_mono_type (return_type); + mono_mb_emit_op (mb, CEE_UNBOX, klass); + mono_mb_emit_op (mb, CEE_LDOBJ, klass); break; } default: @@ -3023,10 +3013,9 @@ cominterop_get_invoke (MonoMethod *method) } else { if (method->flags & METHOD_ATTRIBUTE_VIRTUAL) - mono_mb_emit_byte (mb, CEE_CALLVIRT); + mono_mb_emit_op (mb, CEE_CALLVIRT, method); else - mono_mb_emit_byte (mb, CEE_CALL); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, method)); + mono_mb_emit_op (mb, CEE_CALL, method); } if (!strcmp(method->name, ".ctor")) { @@ -3248,8 +3237,7 @@ static void mono_marshal_emit_xdomain_copy_value (MonoMethodBuilder *mb, MonoClass *pclass) { mono_mb_emit_icall (mb, mono_marshal_xdomain_copy_value); - mono_mb_emit_byte (mb, CEE_CASTCLASS); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, pclass)); + mono_mb_emit_op (mb, CEE_CASTCLASS, pclass); } static void @@ -3305,6 +3293,31 @@ mono_marshal_emit_load_domain_method (MonoMethodBuilder *mb, MonoMethod *method) mono_mb_emit_icall (mb, mono_compile_method); } +/* mono_marshal_check_domain_image () + * Returns TRUE if the image is loaded in the specified + * application domain. + */ +static gboolean +mono_marshal_check_domain_image (gint32 domain_id, MonoImage *image) +{ + MonoAssembly* ass; + GSList *tmp; + + MonoDomain *domain = mono_domain_get_by_id (domain_id); + if (!domain) + return FALSE; + + mono_domain_assemblies_lock (domain); + for (tmp = domain->domain_assemblies; tmp; tmp = tmp->next) { + ass = tmp->data; + if (ass->image == image) + break; + } + mono_domain_assemblies_unlock (domain); + + return tmp != NULL; +} + /* mono_marshal_get_xappdomain_dispatch () * Generates a method that dispatches a method call from another domain into * the current domain. @@ -3407,24 +3420,19 @@ mono_marshal_get_xappdomain_dispatch (MonoMethod *method, int *marshal_types, in if (pt->byref) { if (pclass->valuetype) { mono_mb_emit_byte (mb, CEE_LDELEM_REF); - mono_mb_emit_byte (mb, CEE_UNBOX); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, pclass)); + mono_mb_emit_op (mb, CEE_UNBOX, pclass); } else { - mono_mb_emit_byte (mb, CEE_LDELEMA); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, pclass)); + mono_mb_emit_op (mb, CEE_LDELEMA, pclass); } } else { if (pclass->valuetype) { mono_mb_emit_byte (mb, CEE_LDELEM_REF); - mono_mb_emit_byte (mb, CEE_UNBOX); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, pclass)); - mono_mb_emit_byte (mb, CEE_LDOBJ); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, pclass)); + mono_mb_emit_op (mb, CEE_UNBOX, pclass); + mono_mb_emit_op (mb, CEE_LDOBJ, pclass); } else { mono_mb_emit_byte (mb, CEE_LDELEM_REF); if (pclass != mono_defaults.object_class) { - mono_mb_emit_byte (mb, CEE_CASTCLASS); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, pclass)); + mono_mb_emit_op (mb, CEE_CASTCLASS, pclass); } } } @@ -3463,8 +3471,7 @@ mono_marshal_get_xappdomain_dispatch (MonoMethod *method, int *marshal_types, in emit_thread_force_interrupt_checkpoint (mb); - mono_mb_emit_byte (mb, CEE_CALLVIRT); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, method)); + mono_mb_emit_op (mb, CEE_CALLVIRT, method); if (sig->ret->type != MONO_TYPE_VOID) mono_mb_emit_stloc (mb, loc_return); @@ -3506,8 +3513,7 @@ mono_marshal_get_xappdomain_dispatch (MonoMethod *method, int *marshal_types, in mono_mb_emit_icon (mb, complex_count); /* The array has an additional slot to hold the ret value */ mono_mb_emit_ldloc (mb, loc_return); if (ret_class->valuetype) { - mono_mb_emit_byte (mb, CEE_BOX); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, ret_class)); + mono_mb_emit_op (mb, CEE_BOX, ret_class); } mono_mb_emit_byte (mb, CEE_STELEM_REF); } @@ -3522,8 +3528,7 @@ mono_marshal_get_xappdomain_dispatch (MonoMethod *method, int *marshal_types, in mono_mb_emit_ldarg (mb, 1); mono_mb_emit_ldloc (mb, loc_return); if (ret_class->valuetype) { - mono_mb_emit_byte (mb, CEE_BOX); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, ret_class)); + mono_mb_emit_op (mb, CEE_BOX, ret_class); } mono_mb_emit_managed_call (mb, method_rs_serialize, NULL); mono_mb_emit_byte (mb, CEE_STIND_REF); @@ -3587,8 +3592,8 @@ mono_marshal_get_xappdomain_invoke (MonoMethod *method) MonoMethod *xdomain_method; int ret_marshal_type = MONO_MARSHAL_NONE; int loc_array=0, loc_serialized_data=-1, loc_real_proxy; - int loc_old_domainid, loc_return=0, loc_serialized_exc=0, loc_context; - int pos, pos_noex; + int loc_old_domainid, loc_domainid, loc_return=0, loc_serialized_exc=0, loc_context; + int pos, pos_dispatch, pos_noex; gboolean copy_return = FALSE; g_assert (method); @@ -3648,6 +3653,7 @@ mono_marshal_get_xappdomain_invoke (MonoMethod *method) if (copy_return) loc_return = mono_mb_add_local (mb, sig->ret); loc_old_domainid = mono_mb_add_local (mb, &mono_defaults.int32_class->byval_arg); + loc_domainid = mono_mb_add_local (mb, &mono_defaults.int32_class->byval_arg); loc_serialized_exc = mono_mb_add_local (mb, &byte_array_class->byval_arg); loc_context = mono_mb_add_local (mb, &mono_defaults.object_class->byval_arg); @@ -3661,22 +3667,48 @@ mono_marshal_get_xappdomain_invoke (MonoMethod *method) * through the whole remoting sink, since the context is going to change */ mono_mb_emit_managed_call (mb, method_needs_context_sink, NULL); - pos = mono_mb_emit_short_branch (mb, CEE_BRFALSE_S); + pos = mono_mb_emit_short_branch (mb, CEE_BRTRUE_S); + /* Another case in which the fast path can't be used: when the target domain + * has a different image for the same assembly. + */ + + /* Get the target domain id */ + + mono_mb_emit_ldarg (mb, 0); + mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoTransparentProxy, rp)); + mono_mb_emit_byte (mb, CEE_LDIND_REF); + mono_mb_emit_byte (mb, CEE_DUP); + mono_mb_emit_stloc (mb, loc_real_proxy); + + mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoRealProxy, target_domain_id)); + mono_mb_emit_byte (mb, CEE_LDIND_I4); + mono_mb_emit_stloc (mb, loc_domainid); + + /* Check if the target domain has the same image for the required assembly */ + + mono_mb_emit_ldloc (mb, loc_domainid); + mono_mb_emit_ptr (mb, method->klass->image); + mono_mb_emit_icall (mb, mono_marshal_check_domain_image); + pos_dispatch = mono_mb_emit_short_branch (mb, CEE_BRTRUE_S); + + /* Use the whole remoting sink to dispatch this message */ + + mono_mb_patch_short_branch (mb, pos); + mono_mb_emit_ldarg (mb, 0); for (i = 0; i < sig->param_count; i++) mono_mb_emit_ldarg (mb, i + 1); mono_mb_emit_managed_call (mb, mono_marshal_get_remoting_invoke (method), NULL); mono_mb_emit_byte (mb, CEE_RET); - mono_mb_patch_short_branch (mb, pos); + mono_mb_patch_short_branch (mb, pos_dispatch); /* Create the array that will hold the parameters to be serialized */ if (complex_count > 0) { mono_mb_emit_icon (mb, (ret_marshal_type == MONO_MARSHAL_SERIALIZE && complex_out_count > 0) ? complex_count + 1 : complex_count); /* +1 for the return type */ - mono_mb_emit_byte (mb, CEE_NEWARR); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, mono_defaults.object_class)); + mono_mb_emit_op (mb, CEE_NEWARR, mono_defaults.object_class); j = 0; for (i = 0; i < sig->param_count; i++) { @@ -3687,17 +3719,13 @@ mono_marshal_get_xappdomain_invoke (MonoMethod *method) mono_mb_emit_icon (mb, j); mono_mb_emit_ldarg (mb, i + 1); /* 0=this */ if (sig->params[i]->byref) { - if (pclass->valuetype) { - mono_mb_emit_byte (mb, CEE_LDOBJ); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, pclass)); - } else { + if (pclass->valuetype) + mono_mb_emit_op (mb, CEE_LDOBJ, pclass); + else mono_mb_emit_byte (mb, CEE_LDIND_REF); - } - } - if (pclass->valuetype) { - mono_mb_emit_byte (mb, CEE_BOX); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, pclass)); } + if (pclass->valuetype) + mono_mb_emit_op (mb, CEE_BOX, pclass); mono_mb_emit_byte (mb, CEE_STELEM_REF); j++; } @@ -3714,20 +3742,10 @@ mono_marshal_get_xappdomain_invoke (MonoMethod *method) mono_mb_emit_stloc (mb, loc_serialized_data); } - /* Get the target domain id */ - - mono_mb_emit_ldarg (mb, 0); - mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoTransparentProxy, rp)); - mono_mb_emit_byte (mb, CEE_LDIND_REF); - mono_mb_emit_byte (mb, CEE_DUP); - mono_mb_emit_stloc (mb, loc_real_proxy); - - mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoRealProxy, target_domain_id)); - mono_mb_emit_byte (mb, CEE_LDIND_I4); - mono_mb_emit_byte (mb, CEE_LDC_I4_1); - /* switch domain */ + mono_mb_emit_ldloc (mb, loc_domainid); + mono_mb_emit_byte (mb, CEE_LDC_I4_1); mono_marshal_emit_switch_domain (mb); mono_mb_emit_stloc (mb, loc_old_domainid); @@ -3792,8 +3810,7 @@ mono_marshal_get_xappdomain_invoke (MonoMethod *method) mono_mb_emit_ldloc (mb, loc_serialized_exc); mono_marshal_emit_xdomain_copy_value (mb, byte_array_class); mono_mb_emit_managed_call (mb, method_rs_deserialize, NULL); - mono_mb_emit_byte (mb, CEE_CASTCLASS); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, mono_defaults.exception_class)); + mono_mb_emit_op (mb, CEE_CASTCLASS, mono_defaults.exception_class); mono_mb_emit_managed_call (mb, method_exc_fixexc, NULL); mono_mb_emit_byte (mb, CEE_THROW); mono_mb_patch_addr_s (mb, pos_noex, mb->pos - pos_noex - 1); @@ -3829,17 +3846,12 @@ mono_marshal_get_xappdomain_invoke (MonoMethod *method) mono_mb_emit_icon (mb, j); mono_mb_emit_byte (mb, CEE_LDELEM_REF); if (pclass->valuetype) { - mono_mb_emit_byte (mb, CEE_UNBOX); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, pclass)); - mono_mb_emit_byte (mb, CEE_LDOBJ); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, pclass)); - mono_mb_emit_byte (mb, CEE_STOBJ); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, pclass)); + mono_mb_emit_op (mb, CEE_UNBOX, pclass); + mono_mb_emit_op (mb, CEE_LDOBJ, pclass); + mono_mb_emit_op (mb, CEE_STOBJ, pclass); } else { - if (pclass != mono_defaults.object_class) { - mono_mb_emit_byte (mb, CEE_CASTCLASS); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, pclass)); - } + if (pclass != mono_defaults.object_class) + mono_mb_emit_op (mb, CEE_CASTCLASS, pclass); mono_mb_emit_byte (mb, CEE_STIND_REF); } } @@ -3851,10 +3863,8 @@ mono_marshal_get_xappdomain_invoke (MonoMethod *method) mono_mb_emit_icon (mb, complex_count); mono_mb_emit_byte (mb, CEE_LDELEM_REF); if (ret_class->valuetype) { - mono_mb_emit_byte (mb, CEE_UNBOX); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, ret_class)); - mono_mb_emit_byte (mb, CEE_LDOBJ); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, ret_class)); + mono_mb_emit_op (mb, CEE_UNBOX, ret_class); + mono_mb_emit_op (mb, CEE_LDOBJ, ret_class); } } } else if (ret_marshal_type == MONO_MARSHAL_SERIALIZE) { @@ -3862,13 +3872,10 @@ mono_marshal_get_xappdomain_invoke (MonoMethod *method) mono_marshal_emit_xdomain_copy_value (mb, byte_array_class); mono_mb_emit_managed_call (mb, method_rs_deserialize, NULL); if (ret_class->valuetype) { - mono_mb_emit_byte (mb, CEE_UNBOX); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, ret_class)); - mono_mb_emit_byte (mb, CEE_LDOBJ); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, ret_class)); + mono_mb_emit_op (mb, CEE_UNBOX, ret_class); + mono_mb_emit_op (mb, CEE_LDOBJ, ret_class); } else if (ret_class != mono_defaults.object_class) { - mono_mb_emit_byte (mb, CEE_CASTCLASS); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, ret_class)); + mono_mb_emit_op (mb, CEE_CASTCLASS, ret_class); } } else { mono_mb_emit_ldloc (mb, loc_serialized_data); @@ -4053,8 +4060,7 @@ mono_marshal_get_delegate_invoke (MonoMethod *method) mono_mb_emit_ldarg (mb, 0); mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoDelegate, method_ptr)); mono_mb_emit_byte (mb, CEE_LDIND_I ); - mono_mb_emit_byte (mb, CEE_CALLI); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, sig)); + mono_mb_emit_op (mb, CEE_CALLI, sig); pos1 = mono_mb_emit_branch (mb, CEE_BR); @@ -4066,8 +4072,7 @@ mono_marshal_get_delegate_invoke (MonoMethod *method) mono_mb_emit_ldarg (mb, 0); mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoDelegate, method_ptr)); mono_mb_emit_byte (mb, CEE_LDIND_I ); - mono_mb_emit_byte (mb, CEE_CALLI); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, static_sig)); + mono_mb_emit_op (mb, CEE_CALLI, static_sig); /* return */ mono_mb_patch_branch (mb, pos1); @@ -4288,13 +4293,10 @@ handle_enum: } if (mono_class_is_nullable (mono_class_from_mono_type (sig->params [i]))) { /* Need to convert a boxed vtype to an mp to a Nullable struct */ - mono_mb_emit_byte (mb, CEE_UNBOX); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, mono_class_from_mono_type (sig->params [i]))); - mono_mb_emit_byte (mb, CEE_LDOBJ); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, mono_class_from_mono_type (sig->params [i]))); + mono_mb_emit_op (mb, CEE_UNBOX, mono_class_from_mono_type (sig->params [i])); + mono_mb_emit_op (mb, CEE_LDOBJ, mono_class_from_mono_type (sig->params [i])); } else { - mono_mb_emit_byte (mb, CEE_LDOBJ); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, mono_class_from_mono_type (sig->params [i]))); + mono_mb_emit_op (mb, CEE_LDOBJ, mono_class_from_mono_type (sig->params [i])); } break; default: @@ -4334,8 +4336,7 @@ handle_enum: case MONO_TYPE_TYPEDBYREF: case MONO_TYPE_GENERICINST: /* box value types */ - mono_mb_emit_byte (mb, CEE_BOX); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, mono_class_from_mono_type (sig->ret))); + mono_mb_emit_op (mb, CEE_BOX, mono_class_from_mono_type (sig->ret)); break; case MONO_TYPE_STRING: case MONO_TYPE_CLASS: @@ -4385,8 +4386,7 @@ handle_enum: /* Check for the abort exception */ mono_mb_emit_ldloc (mb, 1); - mono_mb_emit_byte (mb, CEE_ISINST); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, mono_defaults.threadabortexception_class)); + mono_mb_emit_op (mb, CEE_ISINST, mono_defaults.threadabortexception_class); posna = mono_mb_emit_short_branch (mb, CEE_BRFALSE_S); /* Delay the abort exception */ @@ -4577,8 +4577,7 @@ mono_marshal_get_ldfld_wrapper (MonoType *type) */ if (klass->valuetype) { - mono_mb_emit_byte (mb, CEE_UNBOX); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, klass)); + mono_mb_emit_op (mb, CEE_UNBOX, klass); pos1 = mono_mb_emit_branch (mb, CEE_BR); } else { mono_mb_emit_byte (mb, CEE_RET); @@ -4622,13 +4621,11 @@ mono_marshal_get_ldfld_wrapper (MonoType *type) break; case MONO_TYPE_VALUETYPE: g_assert (!klass->enumtype); - mono_mb_emit_byte (mb, CEE_LDOBJ); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, klass)); + mono_mb_emit_op (mb, CEE_LDOBJ, klass); break; case MONO_TYPE_GENERICINST: if (mono_type_generic_inst_is_valuetype (type)) { - mono_mb_emit_byte (mb, CEE_LDOBJ); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, klass)); + mono_mb_emit_op (mb, CEE_LDOBJ, klass); } else { mono_mb_emit_byte (mb, CEE_LDIND_REF); } @@ -4768,10 +4765,8 @@ mono_marshal_get_stfld_remote_wrapper (MonoClass *klass) mono_mb_emit_ldarg (mb, 2); mono_mb_emit_ldarg (mb, 3); - if (klass->valuetype) { - mono_mb_emit_byte (mb, CEE_BOX); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, klass)); - } + if (klass->valuetype) + mono_mb_emit_op (mb, CEE_BOX, klass); csig = mono_metadata_signature_alloc (mono_defaults.corlib, 4); csig->params [0] = &mono_defaults.object_class->byval_arg; @@ -4900,12 +4895,10 @@ mono_marshal_get_stfld_wrapper (MonoType *type) break; case MONO_TYPE_VALUETYPE: g_assert (!klass->enumtype); - mono_mb_emit_byte (mb, CEE_STOBJ); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, klass)); + mono_mb_emit_op (mb, CEE_STOBJ, klass); break; case MONO_TYPE_GENERICINST: - mono_mb_emit_byte (mb, CEE_STOBJ); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, klass)); + mono_mb_emit_op (mb, CEE_STOBJ, klass); break; default: g_warning ("type %x not implemented", type->type); @@ -5091,8 +5084,7 @@ emit_marshal_custom (EmitMarshalContext *m, int argnum, MonoType *t, mono_mb_emit_ldstr (mb, g_strdup (spec->data.custom_data.cookie)); - mono_mb_emit_byte (mb, CEE_CALL); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, get_instance)); + mono_mb_emit_op (mb, CEE_CALL, get_instance); mono_mb_emit_ldarg (mb, argnum); if (t->byref) @@ -5105,12 +5097,10 @@ emit_marshal_custom (EmitMarshalContext *m, int argnum, MonoType *t, */ *conv_arg_type = &mono_defaults.int_class->byval_arg; - mono_mb_emit_byte (mb, CEE_BOX); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, mono_class_from_mono_type (t))); + mono_mb_emit_op (mb, CEE_BOX, mono_class_from_mono_type (t)); } - mono_mb_emit_byte (mb, CEE_CALLVIRT); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, marshal_managed_to_native)); + mono_mb_emit_op (mb, CEE_CALLVIRT, marshal_managed_to_native); mono_mb_emit_stloc (mb, conv_arg); mono_mb_patch_branch (mb, pos2); @@ -5126,24 +5116,20 @@ emit_marshal_custom (EmitMarshalContext *m, int argnum, MonoType *t, mono_mb_emit_ldstr (mb, g_strdup (spec->data.custom_data.cookie)); - mono_mb_emit_byte (mb, CEE_CALL); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, get_instance)); + mono_mb_emit_op (mb, CEE_CALL, get_instance); mono_mb_emit_ldloc (mb, conv_arg); - mono_mb_emit_byte (mb, CEE_CALLVIRT); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, marshal_native_to_managed)); + mono_mb_emit_op (mb, CEE_CALLVIRT, marshal_native_to_managed); mono_mb_emit_byte (mb, CEE_STIND_REF); } mono_mb_emit_ldstr (mb, g_strdup (spec->data.custom_data.cookie)); - mono_mb_emit_byte (mb, CEE_CALL); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, get_instance)); + mono_mb_emit_op (mb, CEE_CALL, get_instance); mono_mb_emit_ldloc (mb, conv_arg); - mono_mb_emit_byte (mb, CEE_CALLVIRT); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, cleanup_native)); + mono_mb_emit_op (mb, CEE_CALLVIRT, cleanup_native); mono_mb_patch_branch (mb, pos2); break; @@ -5169,18 +5155,15 @@ emit_marshal_custom (EmitMarshalContext *m, int argnum, MonoType *t, mono_mb_emit_ldstr (mb, g_strdup (spec->data.custom_data.cookie)); - mono_mb_emit_byte (mb, CEE_CALL); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, get_instance)); + mono_mb_emit_op (mb, CEE_CALL, get_instance); mono_mb_emit_byte (mb, CEE_DUP); mono_mb_emit_ldloc (mb, 3); - mono_mb_emit_byte (mb, CEE_CALLVIRT); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, marshal_native_to_managed)); + mono_mb_emit_op (mb, CEE_CALLVIRT, marshal_native_to_managed); mono_mb_emit_stloc (mb, 3); mono_mb_emit_ldloc (mb, loc1); - mono_mb_emit_byte (mb, CEE_CALLVIRT); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, cleanup_native)); + mono_mb_emit_op (mb, CEE_CALLVIRT, cleanup_native); mono_mb_patch_branch (mb, pos2); break; @@ -5201,13 +5184,11 @@ emit_marshal_custom (EmitMarshalContext *m, int argnum, MonoType *t, pos2 = mono_mb_emit_branch (mb, CEE_BRFALSE); mono_mb_emit_ldstr (mb, g_strdup (spec->data.custom_data.cookie)); - mono_mb_emit_byte (mb, CEE_CALL); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, get_instance)); + mono_mb_emit_op (mb, CEE_CALL, get_instance); mono_mb_emit_ldarg (mb, argnum); - mono_mb_emit_byte (mb, CEE_CALLVIRT); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, marshal_native_to_managed)); + mono_mb_emit_op (mb, CEE_CALLVIRT, marshal_native_to_managed); mono_mb_emit_stloc (mb, conv_arg); mono_mb_patch_branch (mb, pos2); @@ -5228,18 +5209,15 @@ emit_marshal_custom (EmitMarshalContext *m, int argnum, MonoType *t, pos2 = mono_mb_emit_branch (mb, CEE_BRFALSE); mono_mb_emit_ldstr (mb, g_strdup (spec->data.custom_data.cookie)); - mono_mb_emit_byte (mb, CEE_CALL); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, get_instance)); + mono_mb_emit_op (mb, CEE_CALL, get_instance); mono_mb_emit_byte (mb, CEE_DUP); mono_mb_emit_ldloc (mb, 3); - mono_mb_emit_byte (mb, CEE_CALLVIRT); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, marshal_managed_to_native)); + mono_mb_emit_op (mb, CEE_CALLVIRT, marshal_managed_to_native); mono_mb_emit_stloc (mb, 3); mono_mb_emit_ldloc (mb, loc1); - mono_mb_emit_byte (mb, CEE_CALLVIRT); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, cleanup_managed)); + mono_mb_emit_op (mb, CEE_CALLVIRT, cleanup_managed); mono_mb_patch_branch (mb, pos2); break; @@ -5254,12 +5232,10 @@ emit_marshal_custom (EmitMarshalContext *m, int argnum, MonoType *t, /* Call CleanUpManagedData */ mono_mb_emit_ldstr (mb, g_strdup (spec->data.custom_data.cookie)); - mono_mb_emit_byte (mb, CEE_CALL); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, get_instance)); + mono_mb_emit_op (mb, CEE_CALL, get_instance); mono_mb_emit_ldloc (mb, conv_arg); - mono_mb_emit_byte (mb, CEE_CALLVIRT); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, cleanup_managed)); + mono_mb_emit_op (mb, CEE_CALLVIRT, cleanup_managed); mono_mb_patch_branch (mb, pos2); break; @@ -5394,8 +5370,7 @@ emit_marshal_vtype (EmitMarshalContext *m, int argnum, MonoType *t, mono_mb_emit_ldloc (mb, conv_arg); if (!t->byref) { mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_LDNATIVEOBJ); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, klass)); + mono_mb_emit_op (mb, CEE_MONO_LDNATIVEOBJ, klass); } break; @@ -5796,10 +5771,7 @@ emit_marshal_object (EmitMarshalContext *m, int argnum, MonoType *t, mono_mb_emit_stloc (mb, conv_arg); } else if (klass->blittable) { mono_mb_emit_ldarg (mb, argnum); - mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_OBJADDR); - mono_mb_emit_icon (mb, sizeof (MonoObject)); - mono_mb_emit_byte (mb, CEE_ADD); + mono_mb_emit_ldflda (mb, sizeof (MonoObject)); mono_mb_emit_stloc (mb, conv_arg); break; } else { @@ -5840,10 +5812,7 @@ emit_marshal_object (EmitMarshalContext *m, int argnum, MonoType *t, /* set the src_ptr */ mono_mb_emit_ldloc (mb, 0); - mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_OBJADDR); - mono_mb_emit_icon (mb, sizeof (MonoObject)); - mono_mb_emit_byte (mb, CEE_ADD); + mono_mb_emit_ldflda (mb, sizeof (MonoObject)); mono_mb_emit_stloc (mb, 0); /* set dst_ptr */ @@ -5913,10 +5882,8 @@ emit_marshal_object (EmitMarshalContext *m, int argnum, MonoType *t, mono_mb_emit_ldarg (mb, argnum); mono_mb_emit_ldloc (mb, real_proxy); mono_mb_emit_managed_call (mb, get_transparent_proxy, NULL); - if (klass && klass != mono_defaults.object_class) { - mono_mb_emit_byte (mb, CEE_CASTCLASS); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, klass)); - } + if (klass && klass != mono_defaults.object_class) + mono_mb_emit_op (mb, CEE_CASTCLASS, klass); mono_mb_emit_byte (mb, CEE_STIND_REF); // case if null @@ -5954,8 +5921,7 @@ emit_marshal_object (EmitMarshalContext *m, int argnum, MonoType *t, /* allocate a new object */ mono_mb_emit_ldarg (mb, argnum); mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_NEWOBJ); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, t->data.klass)); + mono_mb_emit_op (mb, CEE_MONO_NEWOBJ, t->data.klass); mono_mb_emit_byte (mb, CEE_STIND_REF); } @@ -6026,8 +5992,7 @@ emit_marshal_object (EmitMarshalContext *m, int argnum, MonoType *t, g_assert (!t->byref); mono_mb_emit_stloc (mb, 0); mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_CLASSCONST); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, klass)); + mono_mb_emit_op (mb, CEE_MONO_CLASSCONST, klass); mono_mb_emit_ldloc (mb, 0); mono_mb_emit_icall (mb, conv_to_icall (MONO_MARSHAL_CONV_FTN_DEL)); mono_mb_emit_stloc (mb, 3); @@ -6054,17 +6019,13 @@ emit_marshal_object (EmitMarshalContext *m, int argnum, MonoType *t, /* allocate result object */ mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_NEWOBJ); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, klass)); + mono_mb_emit_op (mb, CEE_MONO_NEWOBJ, klass); mono_mb_emit_stloc (mb, 3); /* set dst */ mono_mb_emit_ldloc (mb, 3); - mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_OBJADDR); - mono_mb_emit_icon (mb, sizeof (MonoObject)); - mono_mb_emit_byte (mb, CEE_ADD); + mono_mb_emit_ldflda (mb, sizeof (MonoObject)); mono_mb_emit_stloc (mb, 1); /* emit conversion code */ @@ -6085,8 +6046,7 @@ emit_marshal_object (EmitMarshalContext *m, int argnum, MonoType *t, if (klass->delegate) { g_assert (!t->byref); mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_CLASSCONST); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, klass)); + mono_mb_emit_op (mb, CEE_MONO_CLASSCONST, klass); mono_mb_emit_ldarg (mb, argnum); mono_mb_emit_icall (mb, conv_to_icall (MONO_MARSHAL_CONV_FTN_DEL)); mono_mb_emit_stloc (mb, conv_arg); @@ -6130,14 +6090,10 @@ emit_marshal_object (EmitMarshalContext *m, int argnum, MonoType *t, /* Create and set dst */ mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_NEWOBJ); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, klass)); + mono_mb_emit_op (mb, CEE_MONO_NEWOBJ, klass); mono_mb_emit_stloc (mb, conv_arg); mono_mb_emit_ldloc (mb, conv_arg); - mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_OBJADDR); - mono_mb_emit_icon (mb, sizeof (MonoObject)); - mono_mb_emit_byte (mb, CEE_ADD); + mono_mb_emit_ldflda (mb, sizeof (MonoObject)); mono_mb_emit_stloc (mb, 1); /* emit valuetype conversion code */ @@ -6159,10 +6115,7 @@ emit_marshal_object (EmitMarshalContext *m, int argnum, MonoType *t, /* Set src */ mono_mb_emit_ldloc (mb, conv_arg); - mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_OBJADDR); - mono_mb_emit_icon (mb, sizeof (MonoObject)); - mono_mb_emit_byte (mb, CEE_ADD); + mono_mb_emit_ldflda (mb, sizeof (MonoObject)); mono_mb_emit_stloc (mb, 0); /* Allocate and set dest */ @@ -6207,10 +6160,7 @@ emit_marshal_object (EmitMarshalContext *m, int argnum, MonoType *t, /* Set src */ mono_mb_emit_ldloc (mb, 0); - mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_OBJADDR); - mono_mb_emit_icon (mb, sizeof (MonoObject)); - mono_mb_emit_byte (mb, CEE_ADD); + mono_mb_emit_ldflda (mb, sizeof (MonoObject)); mono_mb_emit_stloc (mb, 0); /* Allocate and set dest */ @@ -6347,8 +6297,7 @@ emit_marshal_array (EmitMarshalContext *m, int argnum, MonoType *t, /* set the src_ptr */ mono_mb_emit_ldloc (mb, src_var); mono_mb_emit_ldloc (mb, index_var); - mono_mb_emit_byte (mb, CEE_LDELEMA); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, eklass)); + mono_mb_emit_op (mb, CEE_LDELEMA, eklass); mono_mb_emit_stloc (mb, 0); /* set dst_ptr */ @@ -6469,8 +6418,7 @@ emit_marshal_array (EmitMarshalContext *m, int argnum, MonoType *t, if (t->byref) mono_mb_emit_byte (mb, CEE_LDIND_I); mono_mb_emit_ldloc (mb, index_var); - mono_mb_emit_byte (mb, CEE_LDELEMA); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, eklass)); + mono_mb_emit_op (mb, CEE_LDELEMA, eklass); mono_mb_emit_stloc (mb, 1); /* emit valuetype conversion code */ @@ -6625,8 +6573,7 @@ emit_marshal_array (EmitMarshalContext *m, int argnum, MonoType *t, } } - mono_mb_emit_byte (mb, CEE_NEWARR); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, eklass)); + mono_mb_emit_op (mb, CEE_NEWARR, eklass); mono_mb_emit_stloc (mb, conv_arg); if (eklass->blittable) { @@ -7729,8 +7676,7 @@ mono_marshal_get_managed_wrapper (MonoMethod *method, MonoClass *delegate_klass, if (m.retobj_var) { mono_mb_emit_ldloc (mb, m.retobj_var); mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_RETOBJ); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, m.retobj_class)); + mono_mb_emit_op (mb, CEE_MONO_RETOBJ, m.retobj_class); } else { if (!MONO_TYPE_IS_VOID(sig->ret)) @@ -7808,8 +7754,7 @@ mono_marshal_get_isinst (MonoClass *klass) /* check if the object is a proxy that needs special cast */ mono_mb_emit_ldarg (mb, 0); mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_CISINST); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, klass)); + mono_mb_emit_op (mb, CEE_MONO_CISINST, klass); /* The result of MONO_ISINST can be: 0) the type check succeeded @@ -7891,8 +7836,7 @@ mono_marshal_get_castclass (MonoClass *klass) /* check if the object is a proxy that needs special cast */ mono_mb_emit_ldarg (mb, 0); mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_CCASTCLASS); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, klass)); + mono_mb_emit_op (mb, CEE_MONO_CCASTCLASS, klass); /* The result of MONO_ISINST can be: 0) the cast is valid @@ -7970,9 +7914,7 @@ mono_marshal_get_proxy_cancast (MonoClass *klass) can_cast_to = mono_method_desc_search_in_class (desc, mono_defaults.iremotingtypeinfo_class); g_assert (can_cast_to); mono_method_desc_free (desc); - mono_mb_emit_byte (mb, CEE_CALLVIRT); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, can_cast_to)); - + mono_mb_emit_op (mb, CEE_CALLVIRT, can_cast_to); pos_failed = mono_mb_emit_branch (mb, CEE_BRFALSE); @@ -8125,8 +8067,7 @@ mono_marshal_get_ptr_to_struct (MonoClass *klass) /* initialize dst_ptr */ mono_mb_emit_byte (mb, CEE_LDARG_1); - mono_mb_emit_byte (mb, CEE_UNBOX); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, klass)); + mono_mb_emit_op (mb, CEE_UNBOX, klass); mono_mb_emit_stloc (mb, 1); emit_struct_conv (mb, klass, TRUE); @@ -8224,8 +8165,7 @@ mono_marshal_get_synchronized_wrapper (MonoMethod *method) /* this is needed to avoid recursion */ mono_mb_emit_byte (mb, CEE_PREFIX1); - mono_mb_emit_byte (mb, CEE_LDFTN); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, method)); + mono_mb_emit_op (mb, CEE_LDFTN, method); mono_mb_emit_calli (mb, mono_method_signature (method)); if (!MONO_TYPE_IS_VOID (sig->ret)) @@ -8357,8 +8297,7 @@ mono_marshal_get_stelemref () /* ldelema (implicit bound check) */ mono_mb_emit_ldarg (mb, 0); mono_mb_emit_ldarg (mb, 1); - mono_mb_emit_byte (mb, CEE_LDELEMA); - mono_mb_emit_i4 (mb, mono_mb_add_data (mb, mono_defaults.object_class)); + mono_mb_emit_op (mb, CEE_LDELEMA, mono_defaults.object_class); mono_mb_emit_stloc (mb, array_slot_addr); /* if (!value) goto do_store */