2010-01-27 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Wed, 27 Jan 2010 14:43:20 +0000 (14:43 -0000)
committerZoltan Varga <vargaz@gmail.com>
Wed, 27 Jan 2010 14:43:20 +0000 (14:43 -0000)
* object.c (mono_field_get_value_object): Handle nullable types correctly.
Fixes #572874.

svn path=/trunk/mono/; revision=150291

mono/metadata/ChangeLog
mono/metadata/object.c

index 374ced6e3e719b16b3ecafd2758566ca3aafaadb..05d34aae5842fb76e357be93ead00d1a9071c418 100644 (file)
@@ -1,3 +1,8 @@
+2010-01-27  Zoltan Varga  <vargaz@gmail.com>
+
+       * object.c (mono_field_get_value_object): Handle nullable types correctly.
+       Fixes #572874.
+
 2010-01-25  Zoltan Varga  <vargaz@gmail.com>
 
        * icall.c (ves_icall_System_Array_SetValueImpl): Handle nullable types correctly.
index e15bc7a61f4ec018a0438f6f2afa85469c465bb6..e4338eb310fe4c796e3fc3a07888c97b75bdba95 100644 (file)
@@ -2860,6 +2860,26 @@ mono_vtable_get_static_field_data (MonoVTable *vt)
        return vt->data;
 }
 
+static guint8*
+mono_field_get_addr (MonoObject *obj, MonoVTable *vt, MonoClassField *field)
+{
+       guint8 *src;
+
+       if (field->type->attrs & FIELD_ATTRIBUTE_STATIC) {
+               if (field->offset == -1) {
+                       /* Special static */
+                       gpointer addr = g_hash_table_lookup (vt->domain->special_static_fields, field);
+                       src = mono_get_special_static_data (GPOINTER_TO_UINT (addr));
+               } else {
+                       src = (guint8*)vt->data + field->offset;
+               }
+       } else {
+               src = (guint8*)obj + field->offset;
+       }
+
+       return src;
+}
+
 /**
  * mono_field_get_value:
  * @obj: Object instance
@@ -2966,6 +2986,10 @@ mono_field_get_value_object (MonoDomain *domain, MonoClassField *field, MonoObje
 
        /* boxed value type */
        klass = mono_class_from_mono_type (field->type);
+
+       if (mono_class_is_nullable (klass))
+               return mono_nullable_box (mono_field_get_addr (obj, vtable, field), klass);
+
        o = mono_object_new (domain, klass);
        v = ((gchar *) o) + sizeof (MonoObject);
        if (is_static) {