Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/mono/mono/metadata/icall.c
Original file line number Diff line number Diff line change
Expand Up @@ -2158,6 +2158,7 @@ ves_icall_RuntimeFieldInfo_SetValueInternal (MonoReflectionFieldHandle field, Mo
case MONO_TYPE_R8:
case MONO_TYPE_VALUETYPE:
case MONO_TYPE_PTR:
case MONO_TYPE_FNPTR:
isref = FALSE;
if (!MONO_HANDLE_IS_NULL (value)) {
if (m_class_is_valuetype (mono_handle_class (value)))
Expand Down
14 changes: 12 additions & 2 deletions src/mono/mono/metadata/object.c
Original file line number Diff line number Diff line change
Expand Up @@ -2989,7 +2989,7 @@ mono_field_set_value_internal (MonoObject *obj, MonoClassField *field, void *val
} else
dest = (char*)obj + m_field_get_offset (field);

mono_copy_value (field->type, dest, value, value && field->type->type == MONO_TYPE_PTR);
mono_copy_value (field->type, dest, value, value && (field->type->type == MONO_TYPE_PTR || field->type->type == MONO_TYPE_FNPTR));
}

/**
Expand Down Expand Up @@ -3022,7 +3022,7 @@ mono_field_static_set_value_internal (MonoVTable *vt, MonoClassField *field, voi
return;

dest = mono_static_field_get_addr (vt, field);
mono_copy_value (field->type, dest, value, value && field->type->type == MONO_TYPE_PTR);
mono_copy_value (field->type, dest, value, value && (field->type->type == MONO_TYPE_PTR || field->type->type == MONO_TYPE_FNPTR));
}

gpointer
Expand Down Expand Up @@ -3234,6 +3234,7 @@ mono_field_get_value_object_checked (MonoClassField *field, MonoObject *obj, Mon
gboolean is_ref = FALSE;
gboolean is_literal = FALSE;
gboolean is_ptr = FALSE;
gboolean is_fnptr = FALSE;

MonoStringHandle string_handle = MONO_HANDLE_NEW (MonoString, NULL);

Expand Down Expand Up @@ -3272,6 +3273,9 @@ mono_field_get_value_object_checked (MonoClassField *field, MonoObject *obj, Mon
case MONO_TYPE_PTR:
is_ptr = TRUE;
break;
case MONO_TYPE_FNPTR:
is_fnptr = TRUE;
break;
default:
g_error ("type 0x%x not handled in "
"mono_field_get_value_object", type->type);
Expand Down Expand Up @@ -3344,6 +3348,12 @@ mono_field_get_value_object_checked (MonoClassField *field, MonoObject *obj, Mon
goto exit;
}

if (G_UNLIKELY (is_fnptr)) {
// CoreCLR behavior: returns an IntPtr value if we're getting a function pointer field.
// Does not return a System.Reflection.Pointer value in this case
type = mono_get_int_type ();
}

/* boxed value type */
klass = mono_class_from_mono_type_internal (type);

Expand Down