[runtime] Convert locale code to use handles. (mono/mono#15774)
authorZoltan Varga <vargaz@gmail.com>
Tue, 23 Jul 2019 15:33:20 +0000 (11:33 -0400)
committerGitHub <noreply@github.com>
Tue, 23 Jul 2019 15:33:20 +0000 (11:33 -0400)
* [runtime] Convert locale code to use handles.

* Sort a list of defines.

* Remove a do-while.

* Fix c++-ism.

* Use mono_string_handle_to_utf8 (). Update comments.

Commit migrated from https://github.com/mono/mono/commit/a9404577e62c5f90b99e8273ef1fb6ec9f6edcb4

src/mono/mono/metadata/handle.h
src/mono/mono/metadata/icall-def.h
src/mono/mono/metadata/icall-table.h
src/mono/mono/metadata/locales.c
src/mono/mono/metadata/locales.h
src/mono/mono/metadata/object-internals.h

index bd52c82..3029e64 100644 (file)
@@ -386,6 +386,7 @@ This is why we evaluate index and value before any call to MONO_HANDLE_RAW or ot
 // handle->field = (type)value, for non-managed pointers
 // This would be easier to write with the gcc extension typeof,
 // but it is not widely enough implemented (i.e. Microsoft C).
+// The value copy is needed in cases computing value causes a GC
 #define MONO_HANDLE_SETVAL(HANDLE, FIELD, TYPE, VALUE) do {    \
                TYPE __val = (VALUE);   \
                if (0) { TYPE * typecheck G_GNUC_UNUSED = &MONO_HANDLE_SUPPRESS (MONO_HANDLE_RAW (HANDLE)->FIELD); } \
index f03a195..ccbda67 100644 (file)
@@ -353,25 +353,25 @@ HANDLES(GC_9, "get_ephemeron_tombstone", ves_icall_System_GC_get_ephemeron_tombs
 HANDLES(GC_8, "register_ephemeron_array", ves_icall_System_GC_register_ephemeron_array, void, 1, (MonoObject))
 
 ICALL_TYPE(CALDATA, "System.Globalization.CalendarData", CALDATA_1)
-ICALL(CALDATA_1, "fill_calendar_data", ves_icall_System_Globalization_CalendarData_fill_calendar_data)
+HANDLES(CALDATA_1, "fill_calendar_data", ves_icall_System_Globalization_CalendarData_fill_calendar_data, MonoBoolean, 3, (MonoCalendarData, MonoString, gint32))
 
 ICALL_TYPE(COMPINF, "System.Globalization.CompareInfo", COMPINF_4)
 NOHANDLES(ICALL(COMPINF_4, "internal_compare_icall", ves_icall_System_Globalization_CompareInfo_internal_compare))
 NOHANDLES(ICALL(COMPINF_6, "internal_index_icall", ves_icall_System_Globalization_CompareInfo_internal_index))
 
 ICALL_TYPE(CULDATA, "System.Globalization.CultureData", CULDATA_1)
-ICALL(CULDATA_1, "fill_culture_data", ves_icall_System_Globalization_CultureData_fill_culture_data)
+HANDLES(CULDATA_1, "fill_culture_data", ves_icall_System_Globalization_CultureData_fill_culture_data, void, 2, (MonoCultureData, gint32))
 NOHANDLES(ICALL(CULDATA_2, "fill_number_data", ves_icall_System_Globalization_CultureData_fill_number_data))
 
 ICALL_TYPE(CULINF, "System.Globalization.CultureInfo", CULINF_5)
-ICALL(CULINF_5, "construct_internal_locale_from_lcid", ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_lcid)
-ICALL(CULINF_6, "construct_internal_locale_from_name", ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_name)
+HANDLES(CULINF_5, "construct_internal_locale_from_lcid", ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_lcid, MonoBoolean, 2, (MonoCultureInfo, gint32))
+HANDLES(CULINF_6, "construct_internal_locale_from_name", ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_name, MonoBoolean, 2, (MonoCultureInfo, MonoString))
 HANDLES(CULINF_7, "get_current_locale_name", ves_icall_System_Globalization_CultureInfo_get_current_locale_name, MonoString, 0, ())
-ICALL(CULINF_9, "internal_get_cultures", ves_icall_System_Globalization_CultureInfo_internal_get_cultures)
+HANDLES(CULINF_9, "internal_get_cultures", ves_icall_System_Globalization_CultureInfo_internal_get_cultures, MonoArray, 3, (MonoBoolean, MonoBoolean, MonoBoolean))
 //ICALL(CULINF_10, "internal_is_lcid_neutral", ves_icall_System_Globalization_CultureInfo_internal_is_lcid_neutral)
 
 ICALL_TYPE(REGINF, "System.Globalization.RegionInfo", REGINF_2)
-ICALL(REGINF_2, "construct_internal_region_from_name", ves_icall_System_Globalization_RegionInfo_construct_internal_region_from_name)
+HANDLES(REGINF_2, "construct_internal_region_from_name", ves_icall_System_Globalization_RegionInfo_construct_internal_region_from_name, MonoBoolean, 2, (MonoRegionInfo, MonoString))
 
 #if defined(ENABLE_MONODROID) || defined(ENABLE_MONOTOUCH) || defined(TARGET_WASM)
 ICALL_TYPE(DEFLATESTREAM, "System.IO.Compression.DeflateStreamNative", DEFLATESTREAM_1)
index fed2f38..ad7a3af 100644 (file)
@@ -186,8 +186,11 @@ typedef MonoReflectionModuleHandle MonoReflectionModuleOutHandle;
 #define MONO_HANDLE_TYPE_WRAP_MonoAppDomain                    ICALL_HANDLES_WRAP_OBJ
 #define MONO_HANDLE_TYPE_WRAP_MonoAppDomainSetup               ICALL_HANDLES_WRAP_OBJ
 #define MONO_HANDLE_TYPE_WRAP_MonoArray                                ICALL_HANDLES_WRAP_OBJ
+#define MONO_HANDLE_TYPE_WRAP_MonoCalendarData         ICALL_HANDLES_WRAP_OBJ
 #define MONO_HANDLE_TYPE_WRAP_MonoComInteropProxy              ICALL_HANDLES_WRAP_OBJ
 #define MONO_HANDLE_TYPE_WRAP_MonoComObject                    ICALL_HANDLES_WRAP_OBJ
+#define MONO_HANDLE_TYPE_WRAP_MonoCultureData          ICALL_HANDLES_WRAP_OBJ
+#define MONO_HANDLE_TYPE_WRAP_MonoCultureInfo          ICALL_HANDLES_WRAP_OBJ
 #define MONO_HANDLE_TYPE_WRAP_MonoDelegate                     ICALL_HANDLES_WRAP_OBJ
 #define MONO_HANDLE_TYPE_WRAP_MonoReflectionDynamicMethod      ICALL_HANDLES_WRAP_OBJ
 #define MONO_HANDLE_TYPE_WRAP_MonoException                    ICALL_HANDLES_WRAP_OBJ
@@ -210,6 +213,7 @@ typedef MonoReflectionModuleHandle MonoReflectionModuleOutHandle;
 #define MONO_HANDLE_TYPE_WRAP_MonoReflectionSigHelper          ICALL_HANDLES_WRAP_OBJ
 #define MONO_HANDLE_TYPE_WRAP_MonoReflectionType               ICALL_HANDLES_WRAP_OBJ
 #define MONO_HANDLE_TYPE_WRAP_MonoReflectionTypeBuilder                ICALL_HANDLES_WRAP_OBJ
+#define MONO_HANDLE_TYPE_WRAP_MonoRegionInfo           ICALL_HANDLES_WRAP_OBJ
 #define MONO_HANDLE_TYPE_WRAP_MonoString                       ICALL_HANDLES_WRAP_OBJ
 #define MONO_HANDLE_TYPE_WRAP_MonoStringBuilder                        ICALL_HANDLES_WRAP_OBJ
 #define MONO_HANDLE_TYPE_WRAP_MonoThreadObject                 ICALL_HANDLES_WRAP_OBJ
index 25ab2b9..a8efefc 100644 (file)
 
 #undef DEBUG
 
+/* Make sure computing VALUE doesn't cause a GC */
+/* Don't move to handles.h */
+#define mono_handle_setval(handle,field,value) MONO_HANDLE_RAW (handle)->field = (value)
+
+#define mono_handle_setref(handle,field,value) MONO_HANDLE_SET((handle),field,(value))
+
+#define mono_array_handle_setref(array,index,value) MONO_HANDLE_ARRAY_SETREF ((array), (index), (value))
+
 static gint32 string_invariant_compare_char (gunichar2 c1, gunichar2 c2,
                                             gint32 options);
 
@@ -85,67 +93,42 @@ region_name_locator (const void *a, const void *b)
        return ret;
 }
 
-static MonoArray*
-create_group_sizes_array (const gint *gs, gint ml, MonoError *error)
-{
-       MonoArray *ret;
-       int i, len = 0;
-
-       error_init (error);
-
-       for (i = 0; i < ml; i++) {
-               if (gs [i] == -1)
-                       break;
-               len++;
-       }
-       
-       ret = mono_array_new_cached (mono_domain_get (),
-                                    mono_get_int32_class (), len, error);
-       return_val_if_nok (error, NULL);
-
-       for(i = 0; i < len; i++)
-               mono_array_set_internal (ret, gint32, i, gs [i]);
-
-       return ret;
-}
-
-static MonoArray*
+static MonoArrayHandle
 create_names_array_idx (const guint16 *names, int ml, MonoError *error)
 {
-       MonoArray *ret;
+       MonoArrayHandle ret;
        MonoDomain *domain;
-       int i;
-
-       error_init (error);
 
        if (names == NULL)
-               return NULL;
+               return NULL_HANDLE_ARRAY;
 
        domain = mono_domain_get ();
 
-       ret = mono_array_new_cached (mono_domain_get (), mono_get_string_class (), ml, error);
-       return_val_if_nok (error, NULL);
+       ret = mono_array_new_handle (domain, mono_get_string_class (), ml, error);
+       return_val_if_nok (error, NULL_HANDLE_ARRAY);
 
-       for(i = 0; i < ml; i++) {
+       MonoStringHandle s_h = MONO_HANDLE_NEW (MonoString, NULL);
+       for (int i = 0; i < ml; i++) {
                MonoString *s = mono_string_new_checked (domain, dtidx2string (names [i]), error);
-               return_val_if_nok (error, NULL);
-               mono_array_setref_internal (ret, i, s);
+               return_val_if_nok (error, NULL_HANDLE_ARRAY);
+               MONO_HANDLE_ASSIGN_RAW (s_h, s);
+               mono_array_handle_setref (ret, i, s_h);
        }
 
        return ret;
 }
 
-static MonoArray*
+static MonoArrayHandle
 create_names_array_idx_dynamic (const guint16 *names, int ml, MonoError *error)
 {
-       MonoArray *ret;
+       MonoArrayHandle ret;
        MonoDomain *domain;
        int i, len = 0;
 
        error_init (error);
 
        if (names == NULL)
-               return NULL;
+               return NULL_HANDLE_ARRAY;
 
        domain = mono_domain_get ();
 
@@ -155,104 +138,101 @@ create_names_array_idx_dynamic (const guint16 *names, int ml, MonoError *error)
                len++;
        }
 
-       ret = mono_array_new_cached (mono_domain_get (), mono_get_string_class (), len, error);
-       return_val_if_nok (error, NULL);
+       ret = mono_array_new_handle (domain, mono_get_string_class (), len, error);
+       return_val_if_nok (error, NULL_HANDLE_ARRAY);
 
+       MonoStringHandle s_h = MONO_HANDLE_NEW (MonoString, NULL);
        for(i = 0; i < len; i++) {
-               MonoString *s = mono_string_new_checked (domain, pattern2string (names [i]), error);
-               return_val_if_nok (error, NULL);
-               mono_array_setref_internal (ret, i, s);
+               MONO_HANDLE_ASSIGN_RAW (s_h, mono_string_new_checked (domain, pattern2string (names [i]), error));
+               return_val_if_nok (error, NULL_HANDLE_ARRAY);
+               mono_array_handle_setref (ret, i, s_h);
        }
 
        return ret;
 }
 
 MonoBoolean
-ves_icall_System_Globalization_CalendarData_fill_calendar_data (MonoCalendarData *this_obj, MonoString *name, gint32 calendar_index)
+ves_icall_System_Globalization_CalendarData_fill_calendar_data (MonoCalendarDataHandle this_obj, MonoStringHandle name, gint32 calendar_index, MonoError *error)
 {
-       ERROR_DECL (error);
        MonoDomain *domain;
+       MonoArrayHandle arr;
+       MonoStringHandle s;
        const DateTimeFormatEntry *dfe;
        const CultureInfoNameEntry *ne;
        const CultureInfoEntry *ci;
        char *n;
 
-       n = mono_string_to_utf8_checked_internal (name, error);
-       if (mono_error_set_pending_exception (error))
-               return FALSE;
+       n = mono_string_handle_to_utf8 (name, error);
+       return_val_if_nok (error, FALSE);
        ne = (const CultureInfoNameEntry *)mono_binary_search (n, culture_name_entries, NUM_CULTURE_ENTRIES,
                        sizeof (CultureInfoNameEntry), culture_name_locator);
        g_free (n);
-       if (ne == NULL) {
+       if (ne == NULL)
                return FALSE;
-       }
 
        ci = &culture_entries [ne->culture_entry_index];
        dfe = &datetime_format_entries [ci->datetime_format_index];
 
        domain = mono_domain_get ();
 
-       MonoString *native_name = mono_string_new_checked (domain, idx2string (ci->nativename), error);
-       return_val_and_set_pending_if_nok (error, FALSE);
-       MONO_OBJECT_SETREF_INTERNAL (this_obj, NativeName, native_name);
-       MonoArray *short_date_patterns = create_names_array_idx_dynamic (dfe->short_date_patterns,
-                                                                        NUM_SHORT_DATE_PATTERNS, error);
-       return_val_and_set_pending_if_nok (error, FALSE);
-       MONO_OBJECT_SETREF_INTERNAL (this_obj, ShortDatePatterns, short_date_patterns);
-       MonoArray *year_month_patterns =create_names_array_idx_dynamic (dfe->year_month_patterns,
-                                                                       NUM_YEAR_MONTH_PATTERNS, error);
-       return_val_and_set_pending_if_nok (error, FALSE);
-       MONO_OBJECT_SETREF_INTERNAL (this_obj, YearMonthPatterns, year_month_patterns);
-
-       MonoArray *long_date_patterns = create_names_array_idx_dynamic (dfe->long_date_patterns,
-                                                                       NUM_LONG_DATE_PATTERNS, error);
-       return_val_and_set_pending_if_nok (error, FALSE);
-       MONO_OBJECT_SETREF_INTERNAL (this_obj, LongDatePatterns, long_date_patterns);
-
-       MonoString *month_day_pattern = mono_string_new_checked (domain, pattern2string (dfe->month_day_pattern), error);
-       return_val_and_set_pending_if_nok (error, FALSE);
-       MONO_OBJECT_SETREF_INTERNAL (this_obj, MonthDayPattern, month_day_pattern);
-
-       MonoArray *day_names = create_names_array_idx (dfe->day_names, NUM_DAYS, error);
-       return_val_and_set_pending_if_nok (error, FALSE);
-       MONO_OBJECT_SETREF_INTERNAL (this_obj, DayNames, day_names);
-
-       MonoArray *abbr_day_names = create_names_array_idx (dfe->abbreviated_day_names, 
-                                                           NUM_DAYS, error);
-       return_val_and_set_pending_if_nok (error, FALSE);
-       MONO_OBJECT_SETREF_INTERNAL (this_obj, AbbreviatedDayNames, abbr_day_names);
-
-       MonoArray *ss_day_names = create_names_array_idx (dfe->shortest_day_names, NUM_DAYS, error);
-       return_val_and_set_pending_if_nok (error, FALSE);
-       MONO_OBJECT_SETREF_INTERNAL (this_obj, SuperShortDayNames, ss_day_names);
-
-       MonoArray *month_names = create_names_array_idx (dfe->month_names, NUM_MONTHS, error);
-       return_val_and_set_pending_if_nok (error, FALSE);
-       MONO_OBJECT_SETREF_INTERNAL (this_obj, MonthNames, month_names);
-
-       MonoArray *abbr_mon_names = create_names_array_idx (dfe->abbreviated_month_names,
-                                                           NUM_MONTHS, error);
-       return_val_and_set_pending_if_nok (error, FALSE);
-       MONO_OBJECT_SETREF_INTERNAL (this_obj, AbbreviatedMonthNames, abbr_mon_names);
+       s = mono_string_new_handle (domain, idx2string (ci->nativename), error);
+       return_val_if_nok (error, FALSE);
+       MONO_HANDLE_SET (this_obj, NativeName, s);
+
+       arr = create_names_array_idx_dynamic (dfe->short_date_patterns, NUM_SHORT_DATE_PATTERNS, error);
+       return_val_if_nok (error, FALSE);
+       MONO_HANDLE_SET (this_obj, ShortDatePatterns, arr);
+       arr = create_names_array_idx_dynamic (dfe->year_month_patterns,
+                                                                                 NUM_YEAR_MONTH_PATTERNS, error);
+       return_val_if_nok (error, FALSE);
+       MONO_HANDLE_SET (this_obj, YearMonthPatterns, arr);
+
+       arr = create_names_array_idx_dynamic (dfe->long_date_patterns,
+                                                                                 NUM_LONG_DATE_PATTERNS, error);
+       return_val_if_nok (error, FALSE);
+       MONO_HANDLE_SET (this_obj, LongDatePatterns, arr);
+
+       MonoStringHandle month_day_pattern = mono_string_new_handle (domain, pattern2string (dfe->month_day_pattern), error);
+       return_val_if_nok (error, FALSE);
+       MONO_HANDLE_SET (this_obj, MonthDayPattern, month_day_pattern);
+
+       arr = create_names_array_idx (dfe->day_names, NUM_DAYS, error);
+       return_val_if_nok (error, FALSE);
+       MONO_HANDLE_SET (this_obj, DayNames, arr);
+
+       arr = create_names_array_idx (dfe->abbreviated_day_names, NUM_DAYS, error);
+       return_val_if_nok (error, FALSE);
+       MONO_HANDLE_SET (this_obj, AbbreviatedDayNames, arr);
+
+       arr = create_names_array_idx (dfe->shortest_day_names, NUM_DAYS, error);
+       return_val_if_nok (error, FALSE);
+       MONO_HANDLE_SET (this_obj, SuperShortDayNames, arr);
+
+       arr = create_names_array_idx (dfe->month_names, NUM_MONTHS, error);
+       return_val_if_nok (error, FALSE);
+       MONO_HANDLE_SET (this_obj, MonthNames, arr);
 
+       arr = create_names_array_idx (dfe->abbreviated_month_names, NUM_MONTHS, error);
+       return_val_if_nok (error, FALSE);
+       MONO_HANDLE_SET (this_obj, AbbreviatedMonthNames, arr);
        
-       MonoArray *gen_month_names = create_names_array_idx (dfe->month_genitive_names, NUM_MONTHS, error);
-       return_val_and_set_pending_if_nok (error, FALSE);
-       MONO_OBJECT_SETREF_INTERNAL (this_obj, GenitiveMonthNames, gen_month_names);
+       arr = create_names_array_idx (dfe->month_genitive_names, NUM_MONTHS, error);
+       return_val_if_nok (error, FALSE);
+       MONO_HANDLE_SET (this_obj, GenitiveMonthNames, arr);
 
-       MonoArray *gen_abbr_mon_names = create_names_array_idx (dfe->abbreviated_month_genitive_names, NUM_MONTHS, error);
-       return_val_and_set_pending_if_nok (error, FALSE);
-       MONO_OBJECT_SETREF_INTERNAL (this_obj, GenitiveAbbreviatedMonthNames, gen_abbr_mon_names);
+       arr = create_names_array_idx (dfe->abbreviated_month_genitive_names, NUM_MONTHS, error);
+       return_val_if_nok (error, FALSE);
+       MONO_HANDLE_SET (this_obj, GenitiveAbbreviatedMonthNames, arr);
 
        return TRUE;
 }
 
 void
-ves_icall_System_Globalization_CultureData_fill_culture_data (MonoCultureData *this_obj, gint32 datetime_index)
+ves_icall_System_Globalization_CultureData_fill_culture_data (MonoCultureDataHandle this_obj, gint32 datetime_index, MonoError *error)
 {
-       ERROR_DECL (error);
        MonoDomain *domain;
        const DateTimeFormatEntry *dfe;
+       MonoArrayHandle arr;
 
        g_assert (datetime_index >= 0);
 
@@ -260,31 +240,29 @@ ves_icall_System_Globalization_CultureData_fill_culture_data (MonoCultureData *t
 
        domain = mono_domain_get ();
 
-#define SET_STR(obj,field,domain,expr,err) do {                                \
-               MonoString *_tmp_str = mono_string_new_checked ((domain), (expr), (err)); \
-               if (mono_error_set_pending_exception ((err)))           \
-                       return;                                         \
-               MONO_OBJECT_SETREF_INTERNAL ((obj), field, _tmp_str);           \
+#define SET_STR_FIELD(obj,field,domain,expr,error) do {                                        \
+       MonoStringHandle _str = mono_string_new_handle ((domain), (expr), (error));     \
+       return_if_nok (error); \
+       MONO_HANDLE_SET ((obj), field, _str);   \
        } while (0)
 
-       SET_STR (this_obj, AMDesignator, domain, idx2string (dfe->am_designator), error);
-       SET_STR (this_obj, PMDesignator, domain, idx2string (dfe->pm_designator), error);
-       SET_STR (this_obj, TimeSeparator, domain, idx2string (dfe->time_separator), error);
-#undef SET_STR
-
-       MonoArray *long_time_patterns = create_names_array_idx_dynamic (dfe->long_time_patterns,
-                                                                       NUM_LONG_TIME_PATTERNS, error);
-       if (mono_error_set_pending_exception (error))
-               return;
-       MONO_OBJECT_SETREF_INTERNAL (this_obj, LongTimePatterns, long_time_patterns);
-
-       MonoArray *short_time_patterns = create_names_array_idx_dynamic (dfe->short_time_patterns,
-                                                                        NUM_SHORT_TIME_PATTERNS, error);
-       if (mono_error_set_pending_exception (error))
-               return;
-       MONO_OBJECT_SETREF_INTERNAL (this_obj, ShortTimePatterns, short_time_patterns);
-       this_obj->FirstDayOfWeek = dfe->first_day_of_week;
-       this_obj->CalendarWeekRule = dfe->calendar_week_rule;
+       SET_STR_FIELD (this_obj, AMDesignator, domain, idx2string (dfe->am_designator), error);
+       SET_STR_FIELD (this_obj, PMDesignator, domain, idx2string (dfe->pm_designator), error);
+       SET_STR_FIELD (this_obj, TimeSeparator, domain, idx2string (dfe->time_separator), error);
+
+#undef SET_STR_FIELD
+
+       arr = create_names_array_idx_dynamic (dfe->long_time_patterns,
+                                                                                 NUM_LONG_TIME_PATTERNS, error);
+       return_if_nok (error);
+       MONO_HANDLE_SET (this_obj, LongTimePatterns, arr);
+       arr = create_names_array_idx_dynamic (dfe->short_time_patterns,
+                                                                                 NUM_SHORT_TIME_PATTERNS, error);
+       return_if_nok (error);
+       MONO_HANDLE_SET (this_obj, ShortTimePatterns, arr);
+
+       MONO_HANDLE_SETVAL (this_obj, FirstDayOfWeek, guint32, dfe->first_day_of_week);
+       MONO_HANDLE_SETVAL (this_obj, CalendarWeekRule, guint32, dfe->calendar_week_rule);
 }
 
 gconstpointer
@@ -323,70 +301,66 @@ ves_icall_System_Globalization_CultureData_fill_number_data (gint32 number_index
 }
 
 static MonoBoolean
-construct_culture (MonoCultureInfo *this_obj, const CultureInfoEntry *ci, MonoError *error)
+construct_culture (MonoCultureInfoHandle this_obj, const CultureInfoEntry *ci, MonoError *error)
 {
        MonoDomain *domain = mono_domain_get ();
 
-       error_init (error);
-
-       this_obj->lcid = ci->lcid;
+       mono_handle_setval (this_obj, lcid, ci->lcid);
 
-#define SET_STR(obj,field,domain,expr,err) do {                                \
-               MonoString *_tmp_str = mono_string_new_checked ((domain), (expr), (err)); \
-               return_val_if_nok (err, FALSE);                         \
-               MONO_OBJECT_SETREF_INTERNAL ((obj), field, _tmp_str);           \
+#define SET_STR_FIELD(obj,field,domain,expr,error) do {                                        \
+       MonoStringHandle _str = mono_string_new_handle ((domain), (expr), (error));     \
+       return_val_if_nok (error, FALSE);                                                                               \
+       MONO_HANDLE_SET ((obj), field, _str);   \
        } while (0)
 
-       SET_STR (this_obj, name, domain, idx2string (ci->name), error);
-       SET_STR (this_obj, englishname, domain, idx2string (ci->englishname), error);
-       SET_STR (this_obj, nativename, domain, idx2string (ci->nativename), error);
-       SET_STR (this_obj, win3lang, domain, idx2string (ci->win3lang), error);
-       SET_STR (this_obj, iso3lang, domain, idx2string (ci->iso3lang), error);
-       SET_STR (this_obj, iso2lang, domain, idx2string (ci->iso2lang), error);
+       SET_STR_FIELD (this_obj, name, domain, idx2string (ci->name), error);
+       SET_STR_FIELD (this_obj, englishname, domain, idx2string (ci->englishname), error);
+       SET_STR_FIELD (this_obj, nativename, domain, idx2string (ci->nativename), error);
+       SET_STR_FIELD (this_obj, win3lang, domain, idx2string (ci->win3lang), error);
+       SET_STR_FIELD (this_obj, iso3lang, domain, idx2string (ci->iso3lang), error);
+       SET_STR_FIELD (this_obj, iso2lang, domain, idx2string (ci->iso2lang), error);
 
        // It's null for neutral cultures
-       if (ci->territory > 0) {
-               SET_STR (this_obj, territory, domain, idx2string (ci->territory), error);
-       }
+       if (ci->territory > 0)
+               SET_STR_FIELD (this_obj, territory, domain, idx2string (ci->territory), error);
+
+#undef SET_STR_FIELD
 
-       MonoArray *native_calendar_names = create_names_array_idx (ci->native_calendar_names, NUM_CALENDARS, error);
+       MonoArrayHandle native_calendar_names = create_names_array_idx (ci->native_calendar_names, NUM_CALENDARS, error);
        return_val_if_nok (error, FALSE);
-       MONO_OBJECT_SETREF_INTERNAL (this_obj, native_calendar_names, native_calendar_names);
-       this_obj->parent_lcid = ci->parent_lcid;
-       this_obj->datetime_index = ci->datetime_format_index;
-       this_obj->number_index = ci->number_format_index;
-       this_obj->calendar_type = ci->calendar_type;
-       this_obj->text_info_data = &ci->text_info;
-#undef SET_STR
-       
+       mono_handle_setref (this_obj, native_calendar_names, native_calendar_names);
+       mono_handle_setval (this_obj, parent_lcid, ci->parent_lcid);
+       mono_handle_setval (this_obj, datetime_index, ci->datetime_format_index);
+       mono_handle_setval (this_obj, number_index, ci->number_format_index);
+       mono_handle_setval (this_obj, calendar_type, ci->calendar_type);
+       mono_handle_setval (this_obj, text_info_data, &ci->text_info);
        return TRUE;
 }
 
 static MonoBoolean
-construct_region (MonoRegionInfo *this_obj, const RegionInfoEntry *ri, MonoError *error)
+construct_region (MonoRegionInfoHandle this_obj, const RegionInfoEntry *ri, MonoError *error)
 {
        MonoDomain *domain = mono_domain_get ();
 
-       error_init (error);
+       mono_handle_setval (this_obj, geo_id, ri->geo_id);
 
-#define SET_STR(obj,field,domain,expr,err) do {                                \
-               MonoString *_tmp_str = mono_string_new_checked ((domain), (expr), (err)); \
-               return_val_if_nok (err, FALSE);                         \
-               MONO_OBJECT_SETREF_INTERNAL ((obj), field, _tmp_str);           \
+#define SET_STR_FIELD(obj,field,domain,expr,error) do {                                        \
+       MonoStringHandle _str = mono_string_new_handle ((domain), (expr), (error));     \
+       return_val_if_nok (error, FALSE);                                                                               \
+       MONO_HANDLE_SET ((obj), field, _str);   \
        } while (0)
 
-       this_obj->geo_id = ri->geo_id;
-       SET_STR (this_obj, iso2name, domain, idx2string (ri->iso2name), error);
-       SET_STR (this_obj, iso3name, domain, idx2string (ri->iso3name), error);
-       SET_STR (this_obj, win3name, domain, idx2string (ri->win3name), error);
-       SET_STR (this_obj, english_name, domain, idx2string (ri->english_name), error);
-       SET_STR (this_obj, native_name, domain, idx2string (ri->native_name), error);
-       SET_STR (this_obj, currency_symbol, domain, idx2string (ri->currency_symbol), error);
-       SET_STR (this_obj, iso_currency_symbol, domain, idx2string (ri->iso_currency_symbol), error);
-       SET_STR (this_obj, currency_english_name, domain, idx2string (ri->currency_english_name), error);
-       SET_STR (this_obj, currency_native_name, domain, idx2string (ri->currency_native_name), error);
-       
-#undef SET_STR
+       SET_STR_FIELD (this_obj, iso2name, domain, idx2string (ri->iso2name), error);
+       SET_STR_FIELD (this_obj, iso3name, domain, idx2string (ri->iso3name), error);
+       SET_STR_FIELD (this_obj, win3name, domain, idx2string (ri->win3name), error);
+       SET_STR_FIELD (this_obj, english_name, domain, idx2string (ri->english_name), error);
+       SET_STR_FIELD (this_obj, native_name, domain, idx2string (ri->native_name), error);
+       SET_STR_FIELD (this_obj, currency_symbol, domain, idx2string (ri->currency_symbol), error);
+       SET_STR_FIELD (this_obj, iso_currency_symbol, domain, idx2string (ri->iso_currency_symbol), error);
+       SET_STR_FIELD (this_obj, currency_english_name, domain, idx2string (ri->currency_english_name), error);
+       SET_STR_FIELD (this_obj, currency_native_name, domain, idx2string (ri->currency_native_name), error);
+
+#undef SET_STR_FIELD
 
        return TRUE;
 }
@@ -544,13 +518,12 @@ get_current_locale_name (void)
 MonoStringHandle
 ves_icall_System_Globalization_CultureInfo_get_current_locale_name (MonoError *error)
 {
-       error_init (error);
        gchar *locale;
        MonoDomain *domain;
 
        locale = get_current_locale_name ();
        if (locale == NULL)
-               return MONO_HANDLE_CAST (MonoString, NULL_HANDLE);
+               return NULL_HANDLE_STRING;
 
        domain = mono_domain_get ();
        MonoStringHandle ret = mono_string_new_handle (domain, locale, error);
@@ -560,34 +533,27 @@ ves_icall_System_Globalization_CultureInfo_get_current_locale_name (MonoError *e
 }
 
 MonoBoolean
-ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_lcid (MonoCultureInfo *this_obj,
-               gint lcid)
+ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_lcid (MonoCultureInfoHandle this_obj,
+                                                                                                                                                               int lcid, MonoError *error)
 {
-       ERROR_DECL (error);
        const CultureInfoEntry *ci;
        
        ci = culture_info_entry_from_lcid (lcid);
        if(ci == NULL)
                return FALSE;
 
-       if (!construct_culture (this_obj, ci, error)) {
-               mono_error_set_pending_exception (error);
-               return FALSE;
-       }
-       return TRUE;
+       return construct_culture (this_obj, ci, error);
 }
 
 MonoBoolean
-ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_name (MonoCultureInfo *this_obj,
-               MonoString *name)
+ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_name (MonoCultureInfoHandle this_obj,
+                                                                                                                                                               MonoStringHandle name, MonoError *error)
 {
-       ERROR_DECL (error);
        const CultureInfoNameEntry *ne;
        char *n;
        
-       n = mono_string_to_utf8_checked_internal (name, error);
-       if (mono_error_set_pending_exception (error))
-               return FALSE;
+       n = mono_string_handle_to_utf8 (name, error);
+       return_val_if_nok (error, FALSE);
        ne = (const CultureInfoNameEntry *)mono_binary_search (n, culture_name_entries, NUM_CULTURE_ENTRIES,
                        sizeof (CultureInfoNameEntry), culture_name_locator);
 
@@ -598,39 +564,18 @@ ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_name (
        }
        g_free (n);
 
-       if (!construct_culture (this_obj, &culture_entries [ne->culture_entry_index], error)) {
-               mono_error_set_pending_exception (error);
-               return FALSE;
-       }
-       return TRUE;
-}
-/*
-MonoBoolean
-ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_specific_name (MonoCultureInfo *ci,
-               MonoString *name)
-{
-       gchar *locale;
-       gboolean ret;
-
-       locale = mono_string_to_utf8 (name);
-       ret = construct_culture_from_specific_name (ci, locale);
-       g_free (locale);
-
-       return ret;
+       return construct_culture (this_obj, &culture_entries [ne->culture_entry_index], error);
 }
-*/
 
 MonoBoolean
-ves_icall_System_Globalization_RegionInfo_construct_internal_region_from_name (MonoRegionInfo *this_obj,
-               MonoString *name)
+ves_icall_System_Globalization_RegionInfo_construct_internal_region_from_name (MonoRegionInfoHandle this_obj,
+                                                                                                                                                          MonoStringHandle name, MonoError *error)
 {
-       ERROR_DECL (error);
        const RegionInfoNameEntry *ne;
        char *n;
        
-       n = mono_string_to_utf8_checked_internal (name, error);
-       if (mono_error_set_pending_exception (error))
-               return FALSE;
+       n = mono_string_handle_to_utf8 (name, error);
+       return_val_if_nok (error, FALSE);
        ne = (const RegionInfoNameEntry *)mono_binary_search (n, region_name_entries, NUM_REGION_ENTRIES,
                sizeof (RegionInfoNameEntry), region_name_locator);
 
@@ -641,20 +586,18 @@ ves_icall_System_Globalization_RegionInfo_construct_internal_region_from_name (M
        }
        g_free (n);
 
-       MonoBoolean result = construct_region (this_obj, &region_entries [ne->region_entry_index], error);
-       mono_error_set_pending_exception (error);
-       return result;
+       return construct_region (this_obj, &region_entries [ne->region_entry_index], error);
 }
 
-MonoArray*
+MonoArrayHandle
 ves_icall_System_Globalization_CultureInfo_internal_get_cultures (MonoBoolean neutral,
-               MonoBoolean specific, MonoBoolean installed)
+                                                                                                                                 MonoBoolean specific, MonoBoolean installed,
+                                                                                                                                 MonoError *error)
 {
-       ERROR_DECL (error);
-       MonoArray *ret;
+       MonoArrayHandle ret;
        MonoClass *klass;
-       MonoCultureInfo *culture;
        MonoDomain *domain;
+       MonoCultureInfoHandle culture_h;
        const CultureInfoEntry *ci;
        gint i, len;
        gboolean is_neutral;
@@ -676,7 +619,7 @@ ves_icall_System_Globalization_CultureInfo_internal_get_cultures (MonoBoolean ne
        if (neutral)
                len++;
 
-       ret = mono_array_new_checked (domain, klass, len, error);
+       ret = mono_array_new_handle (domain, klass, len, error);
        goto_if_nok (error, fail);
 
        if (len == 0)
@@ -684,20 +627,22 @@ ves_icall_System_Globalization_CultureInfo_internal_get_cultures (MonoBoolean ne
 
        len = 0;
        if (neutral)
-               mono_array_setref_internal (ret, len++, NULL);
+               len ++;
 
+       culture_h = MONO_HANDLE_NEW (MonoCultureInfo, NULL);
        for (i = 0; i < NUM_CULTURE_ENTRIES; i++) {
                ci = &culture_entries [i];
                is_neutral = ci->territory == 0;
                if ((neutral && is_neutral) || (specific && !is_neutral)) {
-                       culture = (MonoCultureInfo *) mono_object_new_checked (domain, klass, error);
+                       MONO_HANDLE_ASSIGN_RAW (culture_h, mono_object_new_checked (domain, klass, error));
                        goto_if_nok (error, fail);
-                       mono_runtime_object_init_checked ((MonoObject *) culture, error);
+                       mono_runtime_object_init_handle (MONO_HANDLE_CAST (MonoObject, culture_h), error);
                        goto_if_nok (error, fail);
-                       if (!construct_culture (culture, ci, error))
+                       if (!construct_culture (culture_h, ci, error))
                                goto fail;
-                       culture->use_user_override = TRUE;
-                       mono_array_setref_internal (ret, len++, culture);
+                       mono_handle_setval (culture_h, use_user_override, TRUE);
+                       mono_array_handle_setref (ret, len, culture_h);
+                       len ++;
                }
        }
 
@@ -708,8 +653,9 @@ fail:
        return ret;
 }
 
-static gint32 string_invariant_compare_char (gunichar2 c1, gunichar2 c2,
-                                            gint32 options)
+static gint32
+string_invariant_compare_char (gunichar2 c1, gunichar2 c2,
+                                                          gint32 options)
 {
        gint32 result;
 
@@ -819,7 +765,8 @@ ves_icall_System_Globalization_CompareInfo_internal_index (const gunichar2 *src,
        }
 }
 
-void ves_icall_System_Text_Normalization_load_normalization_resource (guint8 **argProps,
+void
+ves_icall_System_Text_Normalization_load_normalization_resource (guint8 **argProps,
                                                                      guint8 **argMappedChars,
                                                                      guint8 **argCharMapIndex,
                                                                      guint8 **argHelperIndex,
@@ -827,7 +774,6 @@ void ves_icall_System_Text_Normalization_load_normalization_resource (guint8 **a
                                                                      guint8 **argCombiningClass,
                                                                      MonoError *error)
 {
-       error_init (error);
 #ifdef DISABLE_NORMALIZATION
        mono_error_set_not_supported (error, "This runtime has been compiled without string normalization support.");
        return;
index 0d4c8c6..8746cf9 100644 (file)
@@ -30,12 +30,6 @@ typedef enum {
        CompareOptions_Ordinal=0x40000000
 } MonoCompareOptions;
 
-ICALL_EXPORT
-MonoBoolean ves_icall_System_Globalization_CalendarData_fill_calendar_data (MonoCalendarData *this_obj, MonoString *name, gint32 calendar_index);
-
-ICALL_EXPORT
-void ves_icall_System_Globalization_CultureData_fill_culture_data (MonoCultureData *this_obj, gint32 datetime_index);
-
 typedef struct NumberFormatEntryManaged NumberFormatEntryManaged;
 
 ICALL_EXPORT
@@ -46,15 +40,6 @@ ICALL_EXPORT
 void ves_icall_System_Globalization_CultureInfo_construct_internal_locale (MonoCultureInfo *this_obj, MonoString *locale);
 
 ICALL_EXPORT
-MonoBoolean ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_lcid (MonoCultureInfo *this_obj, gint32 lcid);
-
-ICALL_EXPORT
-MonoBoolean ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_name (MonoCultureInfo *this_obj, MonoString *name);
-
-ICALL_EXPORT
-MonoArray *ves_icall_System_Globalization_CultureInfo_internal_get_cultures (MonoBoolean neutral, MonoBoolean specific, MonoBoolean installed);
-
-ICALL_EXPORT
 void ves_icall_System_Globalization_CompareInfo_construct_compareinfo (MonoCompareInfo *comp, MonoString *locale);
 
 ICALL_EXPORT gint32
@@ -64,11 +49,6 @@ ves_icall_System_Globalization_CompareInfo_internal_compare (const gunichar2 *st
 ICALL_EXPORT
 void ves_icall_System_Globalization_CompareInfo_free_internal_collator (MonoCompareInfo *this_obj);
 
-ICALL_EXPORT
-MonoBoolean
-ves_icall_System_Globalization_RegionInfo_construct_internal_region_from_name (MonoRegionInfo *this_obj,
- MonoString *name);
-
 ICALL_EXPORT gint32
 ves_icall_System_Globalization_CompareInfo_internal_index (const gunichar2 *source, gint32 sindex,
        gint32 count, const gunichar2 *value, gint32 value_length, MonoBoolean first);
index 5e29709..8ec5a9b 100644 (file)
@@ -709,6 +709,8 @@ typedef struct {
        MonoArray *GenitiveAbbreviatedMonthNames;
 } MonoCalendarData;
 
+TYPED_HANDLE_DECL (MonoCalendarData);
+
 typedef struct {
        MonoObject obj;
        MonoString *AMDesignator;
@@ -720,6 +722,8 @@ typedef struct {
        guint32 CalendarWeekRule;
 } MonoCultureData;
 
+TYPED_HANDLE_DECL (MonoCultureData);
+
 typedef struct {
        MonoObject obj;
        MonoBoolean is_read_only;
@@ -744,6 +748,8 @@ typedef struct {
        const void* text_info_data;
 } MonoCultureInfo;
 
+TYPED_HANDLE_DECL (MonoCultureInfo);
+
 typedef struct {
        MonoObject obj;
        gint32 geo_id;
@@ -757,7 +763,10 @@ typedef struct {
        MonoString *currency_english_name;
        MonoString *currency_native_name;
 } MonoRegionInfo;
-#endif
+
+TYPED_HANDLE_DECL (MonoRegionInfo);
+
+#endif /* !ENABLE_NETCORE */
 
 typedef struct {
        MonoObject object;