+ /* same app domain */
+ mono_mb_patch_branch (mb, pos1);
+
+ /* if typeof (this) != contextbound goto pos2 */
+ mono_mb_emit_ldarg (mb, 0);
+ pos2 = mono_mb_emit_contextbound_check (mb, CEE_BEQ);
+
+ /* if this->rp->context == mono_context_get goto pos3 */
+ 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_ldflda (mb, G_STRUCT_OFFSET (MonoRealProxy, context));
+ mono_mb_emit_byte (mb, CEE_LDIND_REF);
+ mono_mb_emit_icall (mb, mono_context_get);
+ pos3 = mono_mb_emit_branch (mb, CEE_BEQ);
+
+ mono_mb_emit_exception_full (mb, "System", "InvalidOperationException", "Attempt to load field address from object in another context.");
+
+ mono_mb_patch_branch (mb, pos2);
+ mono_mb_patch_branch (mb, pos3);
+
+ /* return the address of the field from this->rp->unwrapped_server */
+ 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_ldflda (mb, G_STRUCT_OFFSET (MonoRealProxy, unwrapped_server));
+ 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_ldarg (mb, 3);
+ mono_mb_emit_byte (mb, CEE_ADD);
+ mono_mb_emit_byte (mb, CEE_RET);
+
+ /* not a proxy: return the address of the field directly */