Author: lupus
Date: 2006-03-21 09:59:26 -0500 (Tue, 21 Mar 2006)
New Revision: 58219

Modified:
   trunk/mono/mono/metadata/ChangeLog
   trunk/mono/mono/metadata/appdomain.c
   trunk/mono/mono/metadata/domain.c
   trunk/mono/mono/metadata/exception.c
   trunk/mono/mono/metadata/icall.c
   trunk/mono/mono/metadata/locales.c
   trunk/mono/mono/metadata/marshal.c
   trunk/mono/mono/metadata/object.c
   trunk/mono/mono/metadata/object.h
   trunk/mono/mono/metadata/reflection.c
   trunk/mono/mono/metadata/threadpool.c
   trunk/mono/mono/metadata/threads.c
Log:


Tue Mar 21 15:54:30 CET 2006 Paolo Molaro <[EMAIL PROTECTED]>

        * object.h, appdomain.c, domain.c, exception.c, icall.c,
        locales.c, marshal.c, object.c, reflection.c, threadpool.c,
        threads.c: introduced MONO_OBJECT_SETREF() macro to be able to insert
        write barriers for reference stores with managed objects accessed with
        C structures in the runtime and in embedding programs.



Modified: trunk/mono/mono/metadata/ChangeLog
===================================================================
--- trunk/mono/mono/metadata/ChangeLog  2006-03-21 14:16:07 UTC (rev 58218)
+++ trunk/mono/mono/metadata/ChangeLog  2006-03-21 14:59:26 UTC (rev 58219)
@@ -1,3 +1,12 @@
+
+Tue Mar 21 15:54:30 CET 2006 Paolo Molaro <[EMAIL PROTECTED]>
+
+       * object.h, appdomain.c, domain.c, exception.c, icall.c,
+       locales.c, marshal.c, object.c, reflection.c, threadpool.c,
+       threads.c: introduced MONO_OBJECT_SETREF() macro to be able to insert
+       write barriers for reference stores with managed objects accessed with
+       C structures in the runtime and in embedding programs.
+
 2006-03-20  Raja R Harinath  <[EMAIL PROTECTED]>
 
        * icall.c (ves_icall_Type_GetInterfaces): Avoid using

Modified: trunk/mono/mono/metadata/appdomain.c
===================================================================
--- trunk/mono/mono/metadata/appdomain.c        2006-03-21 14:16:07 UTC (rev 
58218)
+++ trunk/mono/mono/metadata/appdomain.c        2006-03-21 14:59:26 UTC (rev 
58219)
@@ -482,7 +482,7 @@
                /* Inherit from the root domain since MS.NET does this */
                MonoDomain *root = mono_get_root_domain ();
                if (root->setup->application_base)
-                       setup->application_base = mono_string_new_utf16 (data, 
mono_string_chars (root->setup->application_base), mono_string_length 
(root->setup->application_base));
+                       MONO_OBJECT_SETREF (setup, application_base, 
mono_string_new_utf16 (data, mono_string_chars (root->setup->application_base), 
mono_string_length (root->setup->application_base)));
        }
 
        mono_context_init (data);
@@ -1008,7 +1008,7 @@
        }
 
        refass = mono_assembly_get_object (domain, ass);
-       refass->evidence = evidence;
+       MONO_OBJECT_SETREF (refass, evidence, evidence);
        return refass;
 }
 
@@ -1051,7 +1051,7 @@
        if (refass == NULL)
                refass = mono_assembly_get_object (domain, ass);
 
-       refass->evidence = evidence;
+       MONO_OBJECT_SETREF (refass, evidence, evidence);
        return refass;
 }
 
@@ -1124,7 +1124,7 @@
                args = (MonoArray *) mono_array_new (ad->data, 
mono_defaults.string_class, 0);
 
        refass = mono_assembly_get_object (ad->data, assembly);
-       refass->evidence = evidence;
+       MONO_OBJECT_SETREF (refass, evidence, evidence);
 
        res = mono_runtime_exec_main (method, (MonoArray *)args, NULL);
 

Modified: trunk/mono/mono/metadata/domain.c
===================================================================
--- trunk/mono/mono/metadata/domain.c   2006-03-21 14:16:07 UTC (rev 58218)
+++ trunk/mono/mono/metadata/domain.c   2006-03-21 14:59:26 UTC (rev 58219)
@@ -55,7 +55,7 @@
 #endif
 
 #define GET_APPCONTEXT() (mono_thread_current ()->current_appcontext)
-#define SET_APPCONTEXT(x) mono_thread_current ()->current_appcontext = (x)
+#define SET_APPCONTEXT(x) MONO_OBJECT_SETREF (mono_thread_current (), 
current_appcontext, (x))
 
 static guint16 appdomain_list_size = 0;
 static guint16 appdomain_next = 0;

Modified: trunk/mono/mono/metadata/exception.c
===================================================================
--- trunk/mono/mono/metadata/exception.c        2006-03-21 14:16:07 UTC (rev 
58218)
+++ trunk/mono/mono/metadata/exception.c        2006-03-21 14:59:26 UTC (rev 
58219)
@@ -163,7 +163,7 @@
        ex = mono_exception_from_name (image, name_space, name);
 
        if (msg)
-               ex->message = mono_string_new (mono_object_get_domain 
((MonoObject*)ex), msg);
+               MONO_OBJECT_SETREF (ex, message, mono_string_new 
(mono_object_get_domain ((MonoObject*)ex), msg));
 
        return ex;
 }
@@ -400,9 +400,10 @@
        ex = mono_exception_from_name ( 
                mono_get_corlib (), "System", "ArgumentNullException");
 
-       if (arg)
-               ((MonoArgumentException *)ex)->param_name =
-                       mono_string_new (mono_object_get_domain 
((MonoObject*)ex), arg);
+       if (arg) {
+               MonoArgumentException *argex = (MonoArgumentException *)ex;
+               MONO_OBJECT_SETREF (argex, param_name, mono_string_new 
(mono_object_get_domain ((MonoObject*)ex), arg));
+       }
        
        return ex;
 }
@@ -421,9 +422,10 @@
        ex = mono_exception_from_name_msg (
                mono_get_corlib (), "System", "ArgumentException", msg);
 
-       if (arg)
-               ((MonoArgumentException *)ex)->param_name =
-                       mono_string_new (mono_object_get_domain 
((MonoObject*)ex), arg);
+       if (arg) {
+               MonoArgumentException *argex = (MonoArgumentException *)ex;
+               MONO_OBJECT_SETREF (argex, param_name, mono_string_new 
(mono_object_get_domain ((MonoObject*)ex), arg));
+       }
        
        return ex;
 }
@@ -442,9 +444,10 @@
        ex = mono_exception_from_name (
                mono_get_corlib (), "System", "ArgumentOutOfRangeException");
 
-       if (arg)
-               ((MonoArgumentException *)ex)->param_name =
-                       mono_string_new (mono_object_get_domain 
((MonoObject*)ex), arg);
+       if (arg) {
+               MonoArgumentException *argex = (MonoArgumentException *)ex;
+               MONO_OBJECT_SETREF (argex, param_name, mono_string_new 
(mono_object_get_domain ((MonoObject*)ex), arg));
+       }
        
        return ex;
 }

Modified: trunk/mono/mono/metadata/icall.c
===================================================================
--- trunk/mono/mono/metadata/icall.c    2006-03-21 14:16:07 UTC (rev 58218)
+++ trunk/mono/mono/metadata/icall.c    2006-03-21 14:59:26 UTC (rev 58219)
@@ -2512,8 +2512,8 @@
        
        attr = (MonoReflectionDllImportAttribute*)mono_object_new (domain, 
DllImportAttributeClass);
 
-       attr->dll = mono_string_new (domain, scope);
-       attr->entry_point = mono_string_new (domain, import);
+       MONO_OBJECT_SETREF (attr, dll, mono_string_new (domain, scope));
+       MONO_OBJECT_SETREF (attr, entry_point, mono_string_new (domain, 
import));
        attr->call_conv = (flags & 0x700) >> 8;
        attr->charset = ((flags & 0x6) >> 1) + 1;
        if (attr->charset == 1)
@@ -3882,7 +3882,7 @@
                aname = (MonoReflectionAssemblyName *) mono_object_new (
                        domain, System_Reflection_AssemblyName);
 
-               aname->name = mono_string_new (domain, 
mono_metadata_string_heap (image, cols [MONO_ASSEMBLYREF_NAME]));
+               MONO_OBJECT_SETREF (aname, name, mono_string_new (domain, 
mono_metadata_string_heap (image, cols [MONO_ASSEMBLYREF_NAME])));
 
                aname->major = cols [MONO_ASSEMBLYREF_MAJOR_VERSION];
                aname->minor = cols [MONO_ASSEMBLYREF_MINOR_VERSION];
@@ -3891,12 +3891,12 @@
                aname->flags = cols [MONO_ASSEMBLYREF_FLAGS];
                aname->versioncompat = 1; /* SameMachine (default) */
                aname->hashalg = ASSEMBLY_HASH_SHA1; /* SHA1 (default) */
-               aname->version = create_version (domain, aname->major, 
aname->minor, aname->build, aname->revision);
+               MONO_OBJECT_SETREF (aname, version, create_version (domain, 
aname->major, aname->minor, aname->build, aname->revision));
 
                if (create_culture) {
                        gpointer args [1];
                        args [0] = mono_string_new (domain, 
mono_metadata_string_heap (image, cols [MONO_ASSEMBLYREF_CULTURE]));
-                       aname->cultureInfo = mono_runtime_invoke 
(create_culture, NULL, args, NULL);
+                       MONO_OBJECT_SETREF (aname, cultureInfo, 
mono_runtime_invoke (create_culture, NULL, args, NULL));
                }
                
                if (cols [MONO_ASSEMBLYREF_PUBLIC_KEY]) {
@@ -3906,10 +3906,10 @@
                        if ((cols [MONO_ASSEMBLYREF_FLAGS] & 
ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG)) {
                                /* public key token isn't copied - the class 
library will 
                                automatically generate it from the public key 
if required */
-                               aname->publicKey = mono_array_new (domain, 
mono_defaults.byte_class, pkey_len);
+                               MONO_OBJECT_SETREF (aname, publicKey, 
mono_array_new (domain, mono_defaults.byte_class, pkey_len));
                                memcpy (mono_array_addr (aname->publicKey, 
guint8, 0), pkey_ptr, pkey_len);
                        } else {
-                               aname->keyToken = mono_array_new (domain, 
mono_defaults.byte_class, pkey_len);
+                               MONO_OBJECT_SETREF (aname, keyToken, 
mono_array_new (domain, mono_defaults.byte_class, pkey_len));
                                memcpy (mono_array_addr (aname->keyToken, 
guint8, 0), pkey_ptr, pkey_len);
                        }
                }
@@ -4047,7 +4047,7 @@
                        table = &assembly->assembly->image->tables 
[MONO_TABLE_FILE];
                        mono_metadata_decode_row (table, i - 1, file_cols, 
MONO_FILE_SIZE);
                        val = mono_metadata_string_heap 
(assembly->assembly->image, file_cols [MONO_FILE_NAME]);
-                       info->filename = mono_string_new (mono_object_domain 
(assembly), val);
+                       MONO_OBJECT_SETREF (info, filename, mono_string_new 
(mono_object_domain (assembly), val));
                        if (file_cols [MONO_FILE_FLAGS] && 
FILE_CONTAINS_NO_METADATA)
                                info->location = 0;
                        else
@@ -4063,7 +4063,7 @@
                                g_free (msg);
                                mono_raise_exception (ex);
                        }
-                       info->assembly = mono_assembly_get_object 
(mono_domain_get (), assembly->assembly->image->references [i - 1]);
+                       MONO_OBJECT_SETREF (info, assembly, 
mono_assembly_get_object (mono_domain_get (), 
assembly->assembly->image->references [i - 1]));
 
                        /* Obtain info recursively */
                        
ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal 
(info->assembly, name, info);
@@ -4293,18 +4293,18 @@
 
        MONO_ARCH_SAVE_REGS;
 
-       aname->name = mono_string_new (domain, name->name);
+       MONO_OBJECT_SETREF (aname, name, mono_string_new (domain, name->name));
        aname->major = name->major;
        aname->minor = name->minor;
        aname->build = name->build;
        aname->revision = name->revision;
        aname->hashalg = name->hash_alg;
        if (by_default_version)
-               aname->version = create_version (domain, name->major, 
name->minor, name->build, name->revision);
+               MONO_OBJECT_SETREF (aname, version, create_version (domain, 
name->major, name->minor, name->build, name->revision));
        
        codebase = g_filename_to_uri (absolute, NULL, NULL);
        if (codebase) {
-               aname->codebase = mono_string_new (domain, codebase);
+               MONO_OBJECT_SETREF (aname, codebase, mono_string_new (domain, 
codebase));
                g_free (codebase);
        }
 
@@ -4317,14 +4317,14 @@
 
        if (name->culture) {
                args [0] = mono_string_new (domain, name->culture);
-               aname->cultureInfo = mono_runtime_invoke (create_culture, NULL, 
args, NULL);
+               MONO_OBJECT_SETREF (aname, cultureInfo, mono_runtime_invoke 
(create_culture, NULL, args, NULL));
        }
 
        if (name->public_key) {
                pkey_ptr = (char*)name->public_key;
                pkey_len = mono_metadata_decode_blob_size (pkey_ptr, &pkey_ptr);
 
-               aname->publicKey = mono_array_new (domain, 
mono_defaults.byte_class, pkey_len);
+               MONO_OBJECT_SETREF (aname, publicKey, mono_array_new (domain, 
mono_defaults.byte_class, pkey_len));
                memcpy (mono_array_addr (aname->publicKey, guint8, 0), 
pkey_ptr, pkey_len);
        }
 
@@ -4333,7 +4333,7 @@
                int i, j;
                char *p;
 
-               aname->keyToken = mono_array_new (domain, 
mono_defaults.byte_class, 8);
+               MONO_OBJECT_SETREF (aname, keyToken, mono_array_new (domain, 
mono_defaults.byte_class, 8));
                p = mono_array_addr (aname->keyToken, char, 0);
 
                for (i = 0, j = 0; i < 8; i++) {
@@ -5390,7 +5390,7 @@
        res = mono_object_new (domain, mono_defaults.transparent_proxy_class);
        tp = (MonoTransparentProxy*) res;
        
-       tp->rp = rp;
+       MONO_OBJECT_SETREF (tp, rp, rp);
        type = ((MonoReflectionType *)rp->class_to_proxy)->type;
        klass = mono_class_from_mono_type (type);
 

Modified: trunk/mono/mono/metadata/locales.c
===================================================================
--- trunk/mono/mono/metadata/locales.c  2006-03-21 14:16:07 UTC (rev 58218)
+++ trunk/mono/mono/metadata/locales.c  2006-03-21 14:59:26 UTC (rev 58219)
@@ -152,33 +152,33 @@
 
        domain = mono_domain_get ();
 
-       datetime->AbbreviatedDayNames = create_names_array_idx 
(dfe->abbreviated_day_names,
-                       NUM_DAYS);
-       datetime->AbbreviatedMonthNames = create_names_array_idx 
(dfe->abbreviated_month_names,
-                       NUM_MONTHS);
-       datetime->AMDesignator = mono_string_new (domain, idx2string 
(dfe->am_designator));
+       MONO_OBJECT_SETREF (datetime, AbbreviatedDayNames, 
create_names_array_idx (dfe->abbreviated_day_names,
+                       NUM_DAYS));
+       MONO_OBJECT_SETREF (datetime, AbbreviatedMonthNames, 
create_names_array_idx (dfe->abbreviated_month_names,
+                       NUM_MONTHS));
+       MONO_OBJECT_SETREF (datetime, AMDesignator, mono_string_new (domain, 
idx2string (dfe->am_designator)));
        datetime->CalendarWeekRule = dfe->calendar_week_rule;
-       datetime->DateSeparator = mono_string_new (domain, idx2string 
(dfe->date_separator));
-       datetime->DayNames = create_names_array_idx (dfe->day_names, NUM_DAYS);
+       MONO_OBJECT_SETREF (datetime, DateSeparator, mono_string_new (domain, 
idx2string (dfe->date_separator)));
+       MONO_OBJECT_SETREF (datetime, DayNames, create_names_array_idx 
(dfe->day_names, NUM_DAYS));
        datetime->FirstDayOfWeek = dfe->first_day_of_week;
-       datetime->FullDateTimePattern = mono_string_new (domain, idx2string 
(dfe->full_date_time_pattern));
-       datetime->LongDatePattern = mono_string_new (domain, idx2string 
(dfe->long_date_pattern));
-       datetime->LongTimePattern = mono_string_new (domain, idx2string 
(dfe->long_time_pattern));
-       datetime->MonthDayPattern = mono_string_new (domain, idx2string 
(dfe->month_day_pattern));
-       datetime->MonthNames = create_names_array_idx (dfe->month_names, 
NUM_MONTHS);
-       datetime->PMDesignator = mono_string_new (domain, idx2string 
(dfe->pm_designator));
-       datetime->ShortDatePattern = mono_string_new (domain, idx2string 
(dfe->short_date_pattern));
-       datetime->ShortTimePattern = mono_string_new (domain, idx2string 
(dfe->short_time_pattern));
-       datetime->TimeSeparator = mono_string_new (domain, idx2string 
(dfe->time_separator));
-       datetime->YearMonthPattern = mono_string_new (domain, idx2string 
(dfe->year_month_pattern));
-       datetime->ShortDatePatterns = create_names_array_idx 
(dfe->short_date_patterns,
-                       NUM_SHORT_DATE_PATTERNS);
-       datetime->LongDatePatterns = create_names_array_idx 
(dfe->long_date_patterns,
-                       NUM_LONG_DATE_PATTERNS);
-       datetime->ShortTimePatterns = create_names_array_idx 
(dfe->short_time_patterns,
-                       NUM_SHORT_TIME_PATTERNS);
-       datetime->LongTimePatterns = create_names_array_idx 
(dfe->long_time_patterns,
-                       NUM_LONG_TIME_PATTERNS);
+       MONO_OBJECT_SETREF (datetime, FullDateTimePattern, mono_string_new 
(domain, idx2string (dfe->full_date_time_pattern)));
+       MONO_OBJECT_SETREF (datetime, LongDatePattern, mono_string_new (domain, 
idx2string (dfe->long_date_pattern)));
+       MONO_OBJECT_SETREF (datetime, LongTimePattern, mono_string_new (domain, 
idx2string (dfe->long_time_pattern)));
+       MONO_OBJECT_SETREF (datetime, MonthDayPattern, mono_string_new (domain, 
idx2string (dfe->month_day_pattern)));
+       MONO_OBJECT_SETREF (datetime, MonthNames, create_names_array_idx 
(dfe->month_names, NUM_MONTHS));
+       MONO_OBJECT_SETREF (datetime, PMDesignator, mono_string_new (domain, 
idx2string (dfe->pm_designator)));
+       MONO_OBJECT_SETREF (datetime, ShortDatePattern, mono_string_new 
(domain, idx2string (dfe->short_date_pattern)));
+       MONO_OBJECT_SETREF (datetime, ShortTimePattern, mono_string_new 
(domain, idx2string (dfe->short_time_pattern)));
+       MONO_OBJECT_SETREF (datetime, TimeSeparator, mono_string_new (domain, 
idx2string (dfe->time_separator)));
+       MONO_OBJECT_SETREF (datetime, YearMonthPattern, mono_string_new 
(domain, idx2string (dfe->year_month_pattern)));
+       MONO_OBJECT_SETREF (datetime, ShortDatePatterns, create_names_array_idx 
(dfe->short_date_patterns,
+                       NUM_SHORT_DATE_PATTERNS));
+       MONO_OBJECT_SETREF (datetime, LongDatePatterns, create_names_array_idx 
(dfe->long_date_patterns,
+                       NUM_LONG_DATE_PATTERNS));
+       MONO_OBJECT_SETREF (datetime, ShortTimePatterns, create_names_array_idx 
(dfe->short_time_patterns,
+                       NUM_SHORT_TIME_PATTERNS));
+       MONO_OBJECT_SETREF (datetime, LongTimePatterns, create_names_array_idx 
(dfe->long_time_patterns,
+                       NUM_LONG_TIME_PATTERNS));
 
 }
 
@@ -199,40 +199,40 @@
        domain = mono_domain_get ();
 
        number->currencyDecimalDigits = nfe->currency_decimal_digits;
-       number->currencyDecimalSeparator = mono_string_new (domain,
-                       idx2string (nfe->currency_decimal_separator));
-       number->currencyGroupSeparator = mono_string_new (domain,
-                       idx2string (nfe->currency_group_separator));
-       number->currencyGroupSizes = create_group_sizes_array 
(nfe->currency_group_sizes,
-                       GROUP_SIZE);
+       MONO_OBJECT_SETREF (number, currencyDecimalSeparator, mono_string_new 
(domain,
+                       idx2string (nfe->currency_decimal_separator)));
+       MONO_OBJECT_SETREF (number, currencyGroupSeparator, mono_string_new 
(domain,
+                       idx2string (nfe->currency_group_separator)));
+       MONO_OBJECT_SETREF (number, currencyGroupSizes, 
create_group_sizes_array (nfe->currency_group_sizes,
+                       GROUP_SIZE));
        number->currencyNegativePattern = nfe->currency_negative_pattern;
        number->currencyPositivePattern = nfe->currency_positive_pattern;
-       number->currencySymbol = mono_string_new (domain, idx2string 
(nfe->currency_symbol));
-       number->naNSymbol = mono_string_new (domain, idx2string 
(nfe->nan_symbol));
-       number->negativeInfinitySymbol = mono_string_new (domain,
-                       idx2string (nfe->negative_infinity_symbol));
-       number->negativeSign = mono_string_new (domain, idx2string 
(nfe->negative_sign));
+       MONO_OBJECT_SETREF (number, currencySymbol, mono_string_new (domain, 
idx2string (nfe->currency_symbol)));
+       MONO_OBJECT_SETREF (number, naNSymbol, mono_string_new (domain, 
idx2string (nfe->nan_symbol)));
+       MONO_OBJECT_SETREF (number, negativeInfinitySymbol, mono_string_new 
(domain,
+                       idx2string (nfe->negative_infinity_symbol)));
+       MONO_OBJECT_SETREF (number, negativeSign, mono_string_new (domain, 
idx2string (nfe->negative_sign)));
        number->numberDecimalDigits = nfe->number_decimal_digits;
-       number->numberDecimalSeparator = mono_string_new (domain,
-                       idx2string (nfe->number_decimal_separator));
-       number->numberGroupSeparator = mono_string_new (domain, idx2string 
(nfe->number_group_separator));
-       number->numberGroupSizes = create_group_sizes_array 
(nfe->number_group_sizes,
-                       GROUP_SIZE);
+       MONO_OBJECT_SETREF (number, numberDecimalSeparator, mono_string_new 
(domain,
+                       idx2string (nfe->number_decimal_separator)));
+       MONO_OBJECT_SETREF (number, numberGroupSeparator, mono_string_new 
(domain, idx2string (nfe->number_group_separator)));
+       MONO_OBJECT_SETREF (number, numberGroupSizes, create_group_sizes_array 
(nfe->number_group_sizes,
+                       GROUP_SIZE));
        number->numberNegativePattern = nfe->number_negative_pattern;
        number->percentDecimalDigits = nfe->percent_decimal_digits;
-       number->percentDecimalSeparator = mono_string_new (domain,
-                       idx2string (nfe->percent_decimal_separator));
-       number->percentGroupSeparator = mono_string_new (domain,
-                       idx2string (nfe->percent_group_separator));
-       number->percentGroupSizes = create_group_sizes_array 
(nfe->percent_group_sizes,
-                       GROUP_SIZE);
+       MONO_OBJECT_SETREF (number, percentDecimalSeparator, mono_string_new 
(domain,
+                       idx2string (nfe->percent_decimal_separator)));
+       MONO_OBJECT_SETREF (number, percentGroupSeparator, mono_string_new 
(domain,
+                       idx2string (nfe->percent_group_separator)));
+       MONO_OBJECT_SETREF (number, percentGroupSizes, create_group_sizes_array 
(nfe->percent_group_sizes,
+                       GROUP_SIZE));
        number->percentNegativePattern = nfe->percent_negative_pattern;
        number->percentPositivePattern = nfe->percent_positive_pattern;
-       number->percentSymbol = mono_string_new (domain, idx2string 
(nfe->percent_symbol));
-       number->perMilleSymbol = mono_string_new (domain, idx2string 
(nfe->per_mille_symbol));
-       number->positiveInfinitySymbol = mono_string_new (domain,
-                       idx2string (nfe->positive_infinity_symbol));
-       number->positiveSign = mono_string_new (domain, idx2string 
(nfe->positive_sign));
+       MONO_OBJECT_SETREF (number, percentSymbol, mono_string_new (domain, 
idx2string (nfe->percent_symbol)));
+       MONO_OBJECT_SETREF (number, perMilleSymbol, mono_string_new (domain, 
idx2string (nfe->per_mille_symbol)));
+       MONO_OBJECT_SETREF (number, positiveInfinitySymbol, mono_string_new 
(domain,
+                       idx2string (nfe->positive_infinity_symbol)));
+       MONO_OBJECT_SETREF (number, positiveSign, mono_string_new (domain, 
idx2string (nfe->positive_sign)));
 }
 
 static MonoBoolean
@@ -241,14 +241,14 @@
        MonoDomain *domain = mono_domain_get ();
 
        this->lcid = ci->lcid;
-       this->name = mono_string_new (domain, idx2string (ci->name));
-       this->icu_name = mono_string_new (domain, idx2string (ci->icu_name));
-       this->displayname = mono_string_new (domain, idx2string 
(ci->displayname));
-       this->englishname = mono_string_new (domain, idx2string 
(ci->englishname));
-       this->nativename = mono_string_new (domain, idx2string 
(ci->nativename));
-       this->win3lang = mono_string_new (domain, idx2string (ci->win3lang));
-       this->iso3lang = mono_string_new (domain, idx2string (ci->iso3lang));
-       this->iso2lang = mono_string_new (domain, idx2string (ci->iso2lang));
+       MONO_OBJECT_SETREF (this, name, mono_string_new (domain, idx2string 
(ci->name)));
+       MONO_OBJECT_SETREF (this, icu_name, mono_string_new (domain, idx2string 
(ci->icu_name)));
+       MONO_OBJECT_SETREF (this, displayname, mono_string_new (domain, 
idx2string (ci->displayname)));
+       MONO_OBJECT_SETREF (this, englishname, mono_string_new (domain, 
idx2string (ci->englishname)));
+       MONO_OBJECT_SETREF (this, nativename, mono_string_new (domain, 
idx2string (ci->nativename)));
+       MONO_OBJECT_SETREF (this, win3lang, mono_string_new (domain, idx2string 
(ci->win3lang)));
+       MONO_OBJECT_SETREF (this, iso3lang, mono_string_new (domain, idx2string 
(ci->iso3lang)));
+       MONO_OBJECT_SETREF (this, iso2lang, mono_string_new (domain, idx2string 
(ci->iso2lang)));
        this->parent_lcid = ci->parent_lcid;
        this->specific_lcid = ci->specific_lcid;
        this->datetime_index = ci->datetime_format_index;
@@ -265,13 +265,13 @@
        MonoDomain *domain = mono_domain_get ();
 
        this->region_id = ri->region_id;
-       this->iso2name = mono_string_new (domain, idx2string (ri->iso2name));
-       this->iso3name = mono_string_new (domain, idx2string (ri->iso3name));
-       this->win3name = mono_string_new (domain, idx2string (ri->win3name));
-       this->english_name = mono_string_new (domain, idx2string 
(ri->english_name));
-       this->currency_symbol = mono_string_new (domain, idx2string 
(ri->currency_symbol));
-       this->iso_currency_symbol = mono_string_new (domain, idx2string 
(ri->iso_currency_symbol));
-       this->currency_english_name = mono_string_new (domain, idx2string 
(ri->currency_english_name));
+       MONO_OBJECT_SETREF (this, iso2name, mono_string_new (domain, idx2string 
(ri->iso2name)));
+       MONO_OBJECT_SETREF (this, iso3name, mono_string_new (domain, idx2string 
(ri->iso3name)));
+       MONO_OBJECT_SETREF (this, win3name, mono_string_new (domain, idx2string 
(ri->win3name)));
+       MONO_OBJECT_SETREF (this, english_name, mono_string_new (domain, 
idx2string (ri->english_name)));
+       MONO_OBJECT_SETREF (this, currency_symbol, mono_string_new (domain, 
idx2string (ri->currency_symbol)));
+       MONO_OBJECT_SETREF (this, iso_currency_symbol, mono_string_new (domain, 
idx2string (ri->iso_currency_symbol)));
+       MONO_OBJECT_SETREF (this, currency_english_name, mono_string_new 
(domain, idx2string (ri->currency_english_name)));
        
        return TRUE;
 }
@@ -673,7 +673,7 @@
                mono_array_set (arr, guint8, i, mono_string_chars (source)[i]);
        }
        
-       key->key=arr;
+       MONO_OBJECT_SETREF (key, key, arr);
 }
 
 int ves_icall_System_Globalization_CompareInfo_internal_index (MonoCompareInfo 
*this, MonoString *source, gint32 sindex, gint32 count, MonoString *value, 
gint32 options, MonoBoolean first)

Modified: trunk/mono/mono/metadata/marshal.c
===================================================================
--- trunk/mono/mono/metadata/marshal.c  2006-03-21 14:16:07 UTC (rev 58218)
+++ trunk/mono/mono/metadata/marshal.c  2006-03-21 14:59:26 UTC (rev 58219)
@@ -388,7 +388,7 @@
        
        if (!error) {
                if (! sb->str || sb->str == sb->cached_str) {
-                       sb->str = mono_string_new_size (mono_domain_get (), 
items_written);
+                       MONO_OBJECT_SETREF (sb, str, mono_string_new_size 
(mono_domain_get (), items_written));
                        sb->cached_str = NULL;
                }
                
@@ -452,14 +452,14 @@
         * we need to alloc a buffer of the default capacity in this case.
         */
        if (! sb->str)
-               sb->str = mono_string_new_size (mono_domain_get (), 
mono_stringbuilder_capacity (sb));
+               MONO_OBJECT_SETREF (sb, str, mono_string_new_size 
(mono_domain_get (), mono_stringbuilder_capacity (sb)));
        /*
         * The stringbuilder might not have ownership of this string. If this is
         * the case, we must duplicate the string, so that we don't munge 
immutable
         * strings
         */
        else if (sb->str == sb->cached_str) {
-               sb->str = mono_string_new_utf16 (mono_domain_get (), 
mono_string_chars (sb->str), mono_stringbuilder_capacity (sb));
+               MONO_OBJECT_SETREF (sb, str, mono_string_new_utf16 
(mono_domain_get (), mono_string_chars (sb->str), mono_stringbuilder_capacity 
(sb)));
                sb->cached_str = NULL;
        }
        
@@ -922,7 +922,7 @@
                mono_mb_emit_byte (mb, CEE_DUP);
                mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoException, 
message));
                mono_mb_emit_ldstr (mb, (char*)msg);
-               mono_mb_emit_byte (mb, CEE_STIND_I);
+               mono_mb_emit_byte (mb, CEE_STIND_REF);
        }
        mono_mb_emit_byte (mb, CEE_THROW);
 }
@@ -1568,9 +1568,9 @@
                        msg = mono_method_call_message_new 
(mono_marshal_method_from_wrapper (method), params, NULL, &async_callback, 
&state);
                        handle = CreateEvent (NULL, TRUE, FALSE, NULL);
                        ares = mono_async_result_new (mono_domain_get (), 
handle, state, handle);
-                       ares->async_delegate = (MonoObject *)delegate;
-                       ares->async_callback = (MonoObject *)async_callback;
-                       msg->async_result = ares;
+                       MONO_OBJECT_SETREF (ares, async_delegate, (MonoObject 
*)delegate);
+                       MONO_OBJECT_SETREF (ares, async_callback, (MonoObject 
*)async_callback);
+                       MONO_OBJECT_SETREF (msg, async_result, ares);
                        msg->call_type = CallType_BeginInvoke;
 
                        mono_remoting_invoke ((MonoObject *)tp->rp, msg, &exc, 
&out_args);
@@ -1995,7 +1995,7 @@
                msg = (MonoMethodMessage *)mono_object_new (domain, 
mono_defaults.mono_method_message_class);
                mono_message_init (domain, msg, delegate->method_info, NULL);
                msg->call_type = CallType_EndInvoke;
-               msg->async_result = ares;
+               MONO_OBJECT_SETREF (msg, async_result, ares);
                res = mono_remoting_invoke ((MonoObject *)tp->rp, msg, &exc, 
&out_args);
        }
        else
@@ -2007,7 +2007,7 @@
                        char  *tmp;
                        tmp = g_strdup_printf ("%s\nException Rethrown at:\n", 
strace);
                        g_free (strace);        
-                       ((MonoException*)exc)->stack_trace = mono_string_new 
(domain, tmp);
+                       MONO_OBJECT_SETREF (((MonoException*)exc), stack_trace, 
mono_string_new (domain, tmp));
                        g_free (tmp);
                }
                mono_raise_exception ((MonoException*)exc);
@@ -2369,7 +2369,7 @@
        if (mono_object_class (val) == mono_defaults.stringbuilder_class) {
                MonoStringBuilder *oldsb = (MonoStringBuilder *) val;
                MonoStringBuilder *newsb = (MonoStringBuilder *) 
mono_object_new (domain, mono_defaults.stringbuilder_class);
-               newsb->str = mono_string_new_utf16 (domain, mono_string_chars 
(oldsb->str), mono_string_length (oldsb->str));
+               MONO_OBJECT_SETREF (newsb, str, mono_string_new_utf16 (domain, 
mono_string_chars (oldsb->str), mono_string_length (oldsb->str)));
                newsb->length = oldsb->length;
                newsb->max_capacity = (gint32)0x7fffffff;
                return (MonoObject *) newsb;
@@ -2410,7 +2410,7 @@
                MonoStringBuilder *src_sb = (MonoStringBuilder *) src;
                MonoStringBuilder *dst_sb = (MonoStringBuilder *) dst;
        
-               dst_sb->str = mono_string_new_utf16 (mono_object_domain (dst), 
mono_string_chars (src_sb->str), mono_string_length (src_sb->str));
+               MONO_OBJECT_SETREF (dst_sb, str, mono_string_new_utf16 
(mono_object_domain (dst), mono_string_chars (src_sb->str), mono_string_length 
(src_sb->str)));
                dst_sb->cached_str = NULL;
                dst_sb->length = src_sb->length;
        }
@@ -7032,7 +7032,7 @@
        /* get the real proxy from the transparent proxy*/
        mono_mb_emit_ldarg (mb, 0);
        mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoTransparentProxy, rp));
-       mono_mb_emit_byte (mb, CEE_LDIND_I);
+       mono_mb_emit_byte (mb, CEE_LDIND_REF);
        
        /* get the refletion type from the type handle */
        mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX);

Modified: trunk/mono/mono/metadata/object.c
===================================================================
--- trunk/mono/mono/metadata/object.c   2006-03-21 14:16:07 UTC (rev 58218)
+++ trunk/mono/mono/metadata/object.c   2006-03-21 14:59:26 UTC (rev 58219)
@@ -2084,10 +2084,10 @@
 
                assembly = method->klass->image->assembly;
                domain->entry_assembly = assembly;
-               domain->setup->application_base = mono_string_new (domain, 
assembly->basedir);
+               MONO_OBJECT_SETREF (domain->setup, application_base, 
mono_string_new (domain, assembly->basedir));
 
                str = g_strconcat (assembly->image->name, ".config", NULL);
-               domain->setup->configuration_file = mono_string_new (domain, 
str);
+               MONO_OBJECT_SETREF (domain->setup, configuration_file, 
mono_string_new (domain, str));
                g_free (str);
        }
 
@@ -3400,7 +3400,7 @@
         */
 
        if (((MonoObject*)ex)->vtable->klass == 
mono_defaults.threadabortexception_class)
-               mono_thread_current ()->abort_exc = ex;
+               MONO_OBJECT_SETREF (mono_thread_current (), abort_exc, ex);
        
        ex_handler (ex);
 }
@@ -3443,14 +3443,14 @@
 
        /* we must capture the execution context from the original thread */
        if (method) {
-               res->execution_context = mono_runtime_invoke (method, NULL, 
NULL, NULL);
+               MONO_OBJECT_SETREF (res, execution_context, mono_runtime_invoke 
(method, NULL, NULL, NULL));
                /* note: result may be null if the flow is suppressed */
        }
 
        res->data = data;
-       res->async_state = state;
+       MONO_OBJECT_SETREF (res, async_state, state);
        if (handle != NULL)
-               res->handle = (MonoObject *) mono_wait_handle_new (domain, 
handle);
+               MONO_OBJECT_SETREF (res, handle, (MonoObject *) 
mono_wait_handle_new (domain, handle));
 
        res->sync_completed = FALSE;
        res->completed = FALSE;
@@ -3470,16 +3470,16 @@
        char **names;
        guint8 arg_type;
 
-       this->method = method;
+       MONO_OBJECT_SETREF (this, method, method);
 
-       this->args = mono_array_new (domain, mono_defaults.object_class, 
sig->param_count);
-       this->arg_types = mono_array_new (domain, mono_defaults.byte_class, 
sig->param_count);
+       MONO_OBJECT_SETREF (this, args, mono_array_new (domain, 
mono_defaults.object_class, sig->param_count));
+       MONO_OBJECT_SETREF (this, arg_types, mono_array_new (domain, 
mono_defaults.byte_class, sig->param_count));
        this->async_result = NULL;
        this->call_type = CallType_Sync;
 
        names = g_new (char *, sig->param_count);
        mono_method_get_param_names (method->method, (const char **) names);
-       this->names = mono_array_new (domain, mono_defaults.string_class, 
sig->param_count);
+       MONO_OBJECT_SETREF (this, names, mono_array_new (domain, 
mono_defaults.string_class, sig->param_count));
        
        for (i = 0; i < sig->param_count; i++) {
                 name = mono_string_new (domain, names [i]);
@@ -3573,6 +3573,7 @@
                        outarg_count++;
        }
 
+       /* FIXME: GC ensure we insert a write barrier for out_args, maybe in 
the caller? */
        *out_args = mono_array_new (domain, mono_defaults.object_class, 
outarg_count);
        *exc = NULL;
 
@@ -3658,18 +3659,18 @@
 
        if ((ji = mono_jit_info_table_find (domain, mono_get_addr_from_ftnptr 
(addr)))) {
                method = ji->method;
-               delegate->method_info = mono_method_get_object (domain, method, 
NULL);
+               MONO_OBJECT_SETREF (delegate, method_info, 
mono_method_get_object (domain, method, NULL));
        }
 
        if (target && target->vtable->klass == 
mono_defaults.transparent_proxy_class) {
                g_assert (method);
                method = mono_marshal_get_remoting_invoke (method);
                delegate->method_ptr = mono_compile_method (method);
-               delegate->target = target;
+               MONO_OBJECT_SETREF (delegate, target, target);
        } else if (mono_method_signature (method)->hasthis && 
method->klass->valuetype) {
                method = mono_marshal_get_unbox_wrapper (method);
                delegate->method_ptr = mono_compile_method (method);
-               delegate->target = target;
+               MONO_OBJECT_SETREF (delegate, target, target);
        } else {
                if (method) {
                        /* 
@@ -3680,7 +3681,7 @@
                        addr = arch_create_delegate_trampoline (method, addr);
                }
                delegate->method_ptr = addr;
-               delegate->target = target;
+               MONO_OBJECT_SETREF (delegate, target, target);
        }
 }
 
@@ -3865,7 +3866,7 @@
        if (mono_array_length (out_args) == 0)
                return NULL;
 
-       *res = mono_array_get (out_args, MonoObject *, 0);
+       *res = mono_array_get (out_args, MonoObject *, 0); /* FIXME: GC write 
abrrier for res */
 
        if (field_class->valuetype) {
                return ((char *)*res) + sizeof (MonoObject);

Modified: trunk/mono/mono/metadata/object.h
===================================================================
--- trunk/mono/mono/metadata/object.h   2006-03-21 14:16:07 UTC (rev 58218)
+++ trunk/mono/mono/metadata/object.h   2006-03-21 14:59:26 UTC (rev 58219)
@@ -56,6 +56,10 @@
 #define mono_object_class(obj) (((MonoObject*)(obj))->vtable->klass)
 #define mono_object_domain(obj) (((MonoObject*)(obj))->vtable->domain)
 
+#define MONO_OBJECT_SETREF(obj,fieldname,value) do {   \
+               (obj)->fieldname = (value);     \
+       } while (0)
+
 #define mono_array_length(array) ((array)->max_length)
 #define mono_array_addr(array,type,index) ((type*)(gpointer) 
mono_array_addr_with_size (array, sizeof (type), index))
 #define mono_array_addr_with_size(array,size,index) ( ((char*)(array)->vector) 
+ (size) * (index) )

Modified: trunk/mono/mono/metadata/reflection.c
===================================================================
--- trunk/mono/mono/metadata/reflection.c       2006-03-21 14:16:07 UTC (rev 
58218)
+++ trunk/mono/mono/metadata/reflection.c       2006-03-21 14:59:26 UTC (rev 
58219)
@@ -2028,7 +2028,7 @@
 
        entry = g_new0 (GenericParamTableEntry, 1);
        entry->owner = owner;
-       entry->gparam = gparam;
+       entry->gparam = gparam; /* FIXME: GC object stored in unmanaged mem */
 
        g_ptr_array_add (assembly->gen_params, entry);
 }
@@ -2908,7 +2908,7 @@
 {
        int i;
 
-       g_ptr_array_add (types, type);
+       g_ptr_array_add (types, type); /* FIXME: GC object added to unmanaged 
memory */
 
        if (!type->subtypes)
                return;
@@ -5250,11 +5250,12 @@
        res = (MonoReflectionModule *)mono_object_new (domain, 
System_Reflection_Module);
 
        res->image = image;
-       res->assembly = (MonoReflectionAssembly *) 
mono_assembly_get_object(domain, image->assembly);
+       MONO_OBJECT_SETREF (res, assembly, (MonoReflectionAssembly *) 
mono_assembly_get_object(domain, image->assembly));
 
-       res->fqname    = mono_string_new (domain, image->name);
-       res->name      = mono_string_new (domain, basename = 
g_path_get_basename (image->name));
-       res->scopename = mono_string_new (domain, image->module_name);
+       MONO_OBJECT_SETREF (res, fqname, mono_string_new (domain, image->name));
+       basename = g_path_get_basename (image->name);
+       MONO_OBJECT_SETREF (res, name, mono_string_new (domain, basename));
+       MONO_OBJECT_SETREF (res, scopename, mono_string_new (domain, 
image->module_name));
        
        g_free (basename);
 
@@ -5296,8 +5297,8 @@
        g_assert (table_index < table->rows);
        mono_metadata_decode_row (table, table_index, cols, MONO_FILE_SIZE);
 
-       res->image = 0;
-       res->assembly = (MonoReflectionAssembly *) 
mono_assembly_get_object(domain, image->assembly);
+       res->image = NULL;
+       MONO_OBJECT_SETREF (res, assembly, (MonoReflectionAssembly *) 
mono_assembly_get_object(domain, image->assembly));
        name = mono_metadata_string_heap (image, cols [MONO_FILE_NAME]);
 
        /* Check whenever the row has a corresponding row in the moduleref 
table */
@@ -5309,9 +5310,9 @@
                        res->image = image->modules [i];
        }
 
-       res->fqname    = mono_string_new (domain, name);
-       res->name      = mono_string_new (domain, name);
-       res->scopename = mono_string_new (domain, name);
+       MONO_OBJECT_SETREF (res, fqname, mono_string_new (domain, name));
+       MONO_OBJECT_SETREF (res, name, mono_string_new (domain, name));
+       MONO_OBJECT_SETREF (res, scopename, mono_string_new (domain, name));
        res->is_resource = cols [MONO_FILE_FLAGS] && FILE_CONTAINS_NO_METADATA;
        res->token = mono_metadata_make_token (MONO_TABLE_FILE, table_index + 
1);
 
@@ -5434,9 +5435,9 @@
 
        res->type.type = geninst;
        if (gklass->wastypebuilder && gklass->reflection_info)
-               res->generic_type = gklass->reflection_info;
+               MONO_OBJECT_SETREF (res, generic_type, gklass->reflection_info);
        else
-               res->generic_type = mono_type_get_object (domain, 
&gklass->byval_arg);
+               MONO_OBJECT_SETREF (res, generic_type, mono_type_get_object 
(domain, &gklass->byval_arg));
 
        return res;
 }
@@ -5552,8 +5553,8 @@
 
                gret = (MonoReflectionGenericMethod*)mono_object_new (domain, 
klass);
                gret->method.method = method;
-               gret->method.name = mono_string_new (domain, method->name);
-               gret->method.reftype = mono_type_get_object (domain, 
&refclass->byval_arg);
+               MONO_OBJECT_SETREF (gret, method.name, mono_string_new (domain, 
method->name));
+               MONO_OBJECT_SETREF (gret, method.reftype, mono_type_get_object 
(domain, &refclass->byval_arg));
                CACHE_OBJECT (MonoReflectionMethod *, method, 
(MonoReflectionMethod*)gret, refclass);
        }
 
@@ -5569,8 +5570,8 @@
 
        ret = (MonoReflectionMethod*)mono_object_new (domain, klass);
        ret->method = method;
-       ret->name = mono_string_new (domain, method->name);
-       ret->reftype = mono_type_get_object (domain, &refclass->byval_arg);
+       MONO_OBJECT_SETREF (ret, name, mono_string_new (domain, method->name));
+       MONO_OBJECT_SETREF (ret, reftype, mono_type_get_object (domain, 
&refclass->byval_arg));
        CACHE_OBJECT (MonoReflectionMethod *, method, ret, refclass);
 }
 
@@ -5594,12 +5595,12 @@
        res = (MonoReflectionField *)mono_object_new (domain, oklass);
        res->klass = klass;
        res->field = field;
-       res->name = mono_string_new (domain, field->name);
+       MONO_OBJECT_SETREF (res, name, mono_string_new (domain, field->name));
        if (field->generic_info)
                res->attrs = field->generic_info->generic_type->attrs;
        else
                res->attrs = field->type->attrs;
-       res->type = mono_type_get_object (domain, field->type);
+       MONO_OBJECT_SETREF (res, type, mono_type_get_object (domain, 
field->type));
        CACHE_OBJECT (MonoReflectionField *, field, res, klass);
 }
 
@@ -5693,14 +5694,14 @@
        res = mono_array_new (domain, System_Reflection_ParameterInfo, 
mono_method_signature (method)->param_count);
        for (i = 0; i < mono_method_signature (method)->param_count; ++i) {
                param = (MonoReflectionParameter *)mono_object_new (domain, 
System_Reflection_ParameterInfo);
-               param->ClassImpl = mono_type_get_object (domain, 
mono_method_signature (method)->params [i]);
-               param->MemberImpl = (MonoObject*)member;
-               param->NameImpl = mono_string_new (domain, names [i]);
+               MONO_OBJECT_SETREF (param, ClassImpl, mono_type_get_object 
(domain, mono_method_signature (method)->params [i]));
+               MONO_OBJECT_SETREF (param, MemberImpl, (MonoObject*)member);
+               MONO_OBJECT_SETREF (param, NameImpl, mono_string_new (domain, 
names [i]));
                param->PositionImpl = i;
                param->AttrsImpl = mono_method_signature (method)->params 
[i]->attrs;
 
                if (!(param->AttrsImpl & PARAM_ATTRIBUTE_HAS_DEFAULT)) {
-                       param->DefaultValueImpl = dbnull;
+                       MONO_OBJECT_SETREF (param, DefaultValueImpl, dbnull);
                } else {
 
                        if (!blobs) {
@@ -5719,16 +5720,16 @@
                        else    
                                type->data.klass = mono_class_from_mono_type 
(type);
                        
-                       param->DefaultValueImpl = mono_get_object_from_blob 
(domain, type, blobs [i]);
+                       MONO_OBJECT_SETREF (param, DefaultValueImpl, 
mono_get_object_from_blob (domain, type, blobs [i]));
 
                        /* Type in the Constant table is MONO_TYPE_CLASS for 
nulls */
                        if (types [i] != MONO_TYPE_CLASS && 
!param->DefaultValueImpl) 
-                               param->DefaultValueImpl = dbnull;
+                               MONO_OBJECT_SETREF (param, DefaultValueImpl, 
dbnull);
                        
                }
 
                if (mspecs [i + 1])
-                       param->MarshalAsImpl = 
(MonoObject*)mono_reflection_marshal_from_marshal_spec (domain, method->klass, 
mspecs [i + 1]);
+                       MONO_OBJECT_SETREF (param, MarshalAsImpl, 
(MonoObject*)mono_reflection_marshal_from_marshal_spec (domain, method->klass, 
mspecs [i + 1]));
                
                mono_array_setref (res, i, param);
        }
@@ -5808,21 +5809,21 @@
        ret->init_locals = header->init_locals;
        ret->max_stack = header->max_stack;
        ret->local_var_sig_token = local_var_sig_token;
-       ret->il = mono_array_new (domain, mono_defaults.byte_class, 
header->code_size);
+       MONO_OBJECT_SETREF (ret, il, mono_array_new (domain, 
mono_defaults.byte_class, header->code_size));
        memcpy (mono_array_addr (ret->il, guint8, 0), header->code, 
header->code_size);
 
        /* Locals */
-       ret->locals = mono_array_new (domain, 
System_Reflection_LocalVariableInfo, header->num_locals);
+       MONO_OBJECT_SETREF (ret, locals, mono_array_new (domain, 
System_Reflection_LocalVariableInfo, header->num_locals));
        for (i = 0; i < header->num_locals; ++i) {
                MonoReflectionLocalVariableInfo *info = 
(MonoReflectionLocalVariableInfo*)mono_object_new (domain, 
System_Reflection_LocalVariableInfo);
-               info->local_type = mono_type_get_object (domain, header->locals 
[i]);
+               MONO_OBJECT_SETREF (info, local_type, mono_type_get_object 
(domain, header->locals [i]));
                info->is_pinned = header->locals [i]->pinned;
                info->local_index = i;
                mono_array_setref (ret->locals, i, info);
        }
 
        /* Exceptions */
-       ret->clauses = mono_array_new (domain, 
System_Reflection_ExceptionHandlingClause, header->num_clauses);
+       MONO_OBJECT_SETREF (ret, clauses, mono_array_new (domain, 
System_Reflection_ExceptionHandlingClause, header->num_clauses));
        for (i = 0; i < header->num_clauses; ++i) {
                MonoReflectionExceptionHandlingClause *info = 
(MonoReflectionExceptionHandlingClause*)mono_object_new (domain, 
System_Reflection_ExceptionHandlingClause);
                MonoExceptionClause *clause = &header->clauses [i];
@@ -5835,7 +5836,7 @@
                if (clause->flags == MONO_EXCEPTION_CLAUSE_FILTER)
                        info->filter_offset = clause->data.filter_offset;
                else if (clause->data.catch_class)
-                       info->catch_type = mono_type_get_object 
(mono_domain_get (), &clause->data.catch_class->byval_arg);
+                       MONO_OBJECT_SETREF (info, catch_type, 
mono_type_get_object (mono_domain_get (), 
&clause->data.catch_class->byval_arg));
 
                mono_array_setref (ret->clauses, i, info);
        }
@@ -8006,7 +8007,7 @@
        klass->flags = tb->attrs;
 
        klass->element_class = klass;
-       klass->reflection_info = tb; /* need to pin. */
+       klass->reflection_info = tb; /* FIXME: GC need to pin. */
 
        /* Put into cache so mono_class_get () will find it */
        mono_image_add_to_name_cache (klass->image, klass->name_space, 
klass->name, tb->table_idx);
@@ -8235,12 +8236,12 @@
                if (spec->data.custom_data.custom_name) {
                        mtype = mono_reflection_type_from_name 
(spec->data.custom_data.custom_name, klass->image);
                        if (mtype)
-                               minfo->marshaltyperef = mono_type_get_object 
(domain, mtype);
+                               MONO_OBJECT_SETREF (minfo, marshaltyperef, 
mono_type_get_object (domain, mtype));
 
-                       minfo->marshaltype = mono_string_new (domain, 
spec->data.custom_data.custom_name);
+                       MONO_OBJECT_SETREF (minfo, marshaltype, mono_string_new 
(domain, spec->data.custom_data.custom_name));
                }
                if (spec->data.custom_data.cookie)
-                       minfo->mcookie = mono_string_new (domain, 
spec->data.custom_data.cookie);
+                       MONO_OBJECT_SETREF (minfo, mcookie, mono_string_new 
(domain, spec->data.custom_data.cookie));
                break;
 
        default:
@@ -8533,7 +8534,7 @@
                field->type = fb->type->type;
        }
        if ((fb->attrs & FIELD_ATTRIBUTE_HAS_FIELD_RVA) && fb->rva_data)
-               field->data = mono_array_addr (fb->rva_data, char, 0);
+               field->data = mono_array_addr (fb->rva_data, char, 0); /* 
FIXME: GC pin array */
        if (fb->offset != -1)
                field->offset = fb->offset;
        field->parent = klass;
@@ -9438,7 +9439,7 @@
        image = &gparam->tbuilder->module->dynamic_image->image;
        mono_class_from_generic_parameter (param, image, gparam->mbuilder != 
NULL);
 
-       param->pklass->reflection_info = gparam;
+       param->pklass->reflection_info = gparam; /* FIXME: GC pin gparam */
 
        gparam->type.type = g_new0 (MonoType, 1);
        gparam->type.type->type = gparam->mbuilder ? MONO_TYPE_MVAR : 
MONO_TYPE_VAR;
@@ -9534,7 +9535,7 @@
                        mono_raise_exception (mono_get_exception_type_load 
(NULL, NULL));
                        return;
                }
-               rmb.refs [i] = ref;
+               rmb.refs [i] = ref; /* FIXME: GC object stored in unamanged 
memory (change also resolve_object() signature) */
                rmb.refs [i + 1] = handle_class;
        }               
 

Modified: trunk/mono/mono/metadata/threadpool.c
===================================================================
--- trunk/mono/mono/metadata/threadpool.c       2006-03-21 14:16:07 UTC (rev 
58218)
+++ trunk/mono/mono/metadata/threadpool.c       2006-03-21 14:59:26 UTC (rev 
58219)
@@ -850,7 +850,7 @@
 socket_io_add (MonoAsyncResult *ares, MonoSocketAsyncResult *state)
 {
        socket_io_init (&socket_io_data);
-       state->ares = ares;
+       MONO_OBJECT_SETREF (state, ares, ares);
 #ifdef HAVE_EPOLL
        if (socket_io_data.epoll_disabled == FALSE) {
                if (socket_io_add_epoll (state))
@@ -903,8 +903,8 @@
        if (ares->execution_context) {
                /* use captured ExecutionContext (if available) */
                thread = mono_thread_current ();
-               ares->original_context = thread->execution_context;
-               thread->execution_context = ares->execution_context;
+               MONO_OBJECT_SETREF (ares, original_context, 
thread->execution_context);
+               MONO_OBJECT_SETREF (thread, execution_context, 
ares->execution_context);
        } else {
                ares->original_context = NULL;
        }
@@ -923,12 +923,12 @@
                /* 'exc' will be the previous ac->msg->exc if not NULL and not
                 * catched. If catched, this will be set to NULL and the
                 * exception will not be printed. */
-               ac->msg->exc = exc;
+               MONO_OBJECT_SETREF (ac->msg, exc, exc);
        }
 
        /* restore original thread execution context if flow isn't suppressed, 
i.e. non null */
        if (ares->original_context) {
-               thread->execution_context = ares->original_context;
+               MONO_OBJECT_SETREF (thread, execution_context, 
ares->original_context);
                ares->original_context = NULL;
        }
 
@@ -993,7 +993,7 @@
        }
 
        ares = mono_async_result_new (domain, NULL, ac->state, ac);
-       ares->async_delegate = target;
+       MONO_OBJECT_SETREF (ares, async_delegate, target);
 
        EnterCriticalSection (&ares_lock);
        mono_g_hash_table_insert (ares_htable, ares, ares);
@@ -1055,7 +1055,7 @@
        if (!ares->completed) {
                if (ares->handle == NULL) {
                        ac->wait_event = CreateEvent (NULL, TRUE, FALSE, NULL);
-                       ares->handle = (MonoObject *) mono_wait_handle_new 
(mono_object_domain (ares), ac->wait_event);
+                       MONO_OBJECT_SETREF (ares, handle, (MonoObject *) 
mono_wait_handle_new (mono_object_domain (ares), ac->wait_event));
                }
                mono_monitor_exit ((MonoObject *) ares);
                WaitForSingleObjectEx (ac->wait_event, INFINITE, TRUE);
@@ -1063,7 +1063,7 @@
                mono_monitor_exit ((MonoObject *) ares);
        }
 
-       *exc = ac->msg->exc;
+       *exc = ac->msg->exc; /* FIXME: GC add write barrier */
        *out_args = ac->out_args;
 
        return ac->res;

Modified: trunk/mono/mono/metadata/threads.c
===================================================================
--- trunk/mono/mono/metadata/threads.c  2006-03-21 14:16:07 UTC (rev 58218)
+++ trunk/mono/mono/metadata/threads.c  2006-03-21 14:59:26 UTC (rev 58219)
@@ -380,7 +380,7 @@
        thread->handle=thread_handle;
        thread->tid=tid;
 
-       thread->synch_lock=mono_object_new (domain, mono_defaults.object_class);
+       MONO_OBJECT_SETREF (thread, synch_lock, mono_object_new (domain, 
mono_defaults.object_class));
                                                  
        handle_store(thread);
 
@@ -424,7 +424,7 @@
 
        thread->handle=thread_handle;
        thread->tid=tid;
-       thread->synch_lock=mono_object_new (domain, mono_defaults.object_class);
+       MONO_OBJECT_SETREF (thread, synch_lock, mono_object_new (domain, 
mono_defaults.object_class));
 
        THREAD_DEBUG (g_message ("%s: Attached thread ID %"G_GSIZE_FORMAT" 
(handle %p)", __func__, tid, thread_handle));
 
@@ -503,7 +503,7 @@
                /* This is freed in start_wrapper */
                start_info = g_new0 (struct StartInfo, 1);
                start_info->func = start_func;
-               start_info->start_arg = this->start_obj;
+               start_info->start_arg = this->start_obj; /* FIXME: GC object 
stored in unmanaged memory */
                start_info->delegate = start;
                start_info->obj = this;
                start_info->domain = mono_domain_get ();
@@ -1554,7 +1554,7 @@
        }
 
        thread->state |= ThreadState_AbortRequested;
-       thread->abort_state = state;
+       MONO_OBJECT_SETREF (thread, abort_state, state);
        thread->abort_exc = NULL;
 
        mono_monitor_exit (thread->synch_lock);
@@ -2725,7 +2725,7 @@
 
        if ((thread->state & ThreadState_AbortRequested) != 0) {
                if (thread->abort_exc == NULL)
-                       thread->abort_exc = mono_get_exception_thread_abort ();
+                       MONO_OBJECT_SETREF (thread, abort_exc, 
mono_get_exception_thread_abort ());
                mono_monitor_exit (thread->synch_lock);
                return thread->abort_exc;
        }

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to