From: Zoltan Varga Date: Tue, 23 Jul 2019 15:33:20 +0000 (-0400) Subject: [runtime] Convert locale code to use handles. (mono/mono#15774) X-Git-Tag: submit/tizen/20210909.063632~10331^2~5^2~940 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f05b6c4a5f2dd263f7d3d221fc5c2ef96758e8e1;p=platform%2Fupstream%2Fdotnet%2Fruntime.git [runtime] Convert locale code to use handles. (mono/mono#15774) * [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 --- diff --git a/src/mono/mono/metadata/handle.h b/src/mono/mono/metadata/handle.h index bd52c82..3029e64 100644 --- a/src/mono/mono/metadata/handle.h +++ b/src/mono/mono/metadata/handle.h @@ -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); } \ diff --git a/src/mono/mono/metadata/icall-def.h b/src/mono/mono/metadata/icall-def.h index f03a195..ccbda67 100644 --- a/src/mono/mono/metadata/icall-def.h +++ b/src/mono/mono/metadata/icall-def.h @@ -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) diff --git a/src/mono/mono/metadata/icall-table.h b/src/mono/mono/metadata/icall-table.h index fed2f38..ad7a3af 100644 --- a/src/mono/mono/metadata/icall-table.h +++ b/src/mono/mono/metadata/icall-table.h @@ -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 diff --git a/src/mono/mono/metadata/locales.c b/src/mono/mono/metadata/locales.c index 25ab2b9..a8efefc 100644 --- a/src/mono/mono/metadata/locales.c +++ b/src/mono/mono/metadata/locales.c @@ -44,6 +44,14 @@ #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, ®ion_entries [ne->region_entry_index], error); - mono_error_set_pending_exception (error); - return result; + return construct_region (this_obj, ®ion_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; diff --git a/src/mono/mono/metadata/locales.h b/src/mono/mono/metadata/locales.h index 0d4c8c6..8746cf9 100644 --- a/src/mono/mono/metadata/locales.h +++ b/src/mono/mono/metadata/locales.h @@ -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); diff --git a/src/mono/mono/metadata/object-internals.h b/src/mono/mono/metadata/object-internals.h index 5e29709..8ec5a9b 100644 --- a/src/mono/mono/metadata/object-internals.h +++ b/src/mono/mono/metadata/object-internals.h @@ -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;