* Copyright 2004-2009 Novell, Inc (http://www.novell.com)
* (C) 2003 PT Cakram Datalingga Duaribu http://www.cdl2000.com
* Copyright (C) 2012 Xamarin Inc (http://www.xamarin.com)
+ * Licensed under the MIT license. See LICENSE file in the project root for full license information.
*/
#include <config.h>
}
static MonoArray*
-create_group_sizes_array (const gint *gs, gint ml)
+create_group_sizes_array (const gint *gs, gint ml, MonoError *error)
{
MonoArray *ret;
int i, len = 0;
+ mono_error_init (error);
+
for (i = 0; i < ml; i++) {
if (gs [i] == -1)
break;
}
ret = mono_array_new_cached (mono_domain_get (),
- mono_get_int32_class (), len);
+ mono_get_int32_class (), len, error);
+ return_val_if_nok (error, NULL);
for(i = 0; i < len; i++)
mono_array_set (ret, gint32, i, gs [i]);
}
static MonoArray*
-create_names_array_idx (const guint16 *names, int ml)
+create_names_array_idx (const guint16 *names, int ml, MonoError *error)
{
MonoArray *ret;
MonoDomain *domain;
int i;
+ mono_error_init (error);
+
if (names == NULL)
return NULL;
domain = mono_domain_get ();
- ret = mono_array_new_cached (mono_domain_get (), mono_get_string_class (), ml);
+ ret = mono_array_new_cached (mono_domain_get (), mono_get_string_class (), ml, error);
+ return_val_if_nok (error, NULL);
for(i = 0; i < ml; i++)
mono_array_setref (ret, i, mono_string_new (domain, idx2string (names [i])));
}
static MonoArray*
-create_names_array_idx_dynamic (const guint16 *names, int ml)
+create_names_array_idx_dynamic (const guint16 *names, int ml, MonoError *error)
{
MonoArray *ret;
MonoDomain *domain;
int i, len = 0;
+ mono_error_init (error);
+
if (names == NULL)
return NULL;
len++;
}
- ret = mono_array_new_cached (mono_domain_get (), mono_get_string_class (), len);
+ ret = mono_array_new_cached (mono_domain_get (), mono_get_string_class (), len, error);
+ return_val_if_nok (error, NULL);
for(i = 0; i < len; i++)
mono_array_setref (ret, i, mono_string_new (domain, idx2string (names [i])));
MonoBoolean
ves_icall_System_Globalization_CalendarData_fill_calendar_data (MonoCalendarData *this_obj, MonoString *name, gint32 calendar_index)
{
+ MonoError error;
MonoDomain *domain;
const DateTimeFormatEntry *dfe;
const CultureInfoNameEntry *ne;
domain = mono_domain_get ();
MONO_OBJECT_SETREF (this_obj, NativeName, mono_string_new (domain, idx2string (ci->nativename)));
- MONO_OBJECT_SETREF (this_obj, ShortDatePatterns, create_names_array_idx_dynamic (dfe->short_date_patterns,
- NUM_SHORT_DATE_PATTERNS));
- MONO_OBJECT_SETREF (this_obj, YearMonthPatterns, create_names_array_idx_dynamic (dfe->year_month_patterns,
- NUM_YEAR_MONTH_PATTERNS));
+ 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 (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 (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 (this_obj, LongDatePatterns, long_date_patterns);
- MONO_OBJECT_SETREF (this_obj, LongDatePatterns, create_names_array_idx_dynamic (dfe->long_date_patterns,
- NUM_LONG_DATE_PATTERNS));
MONO_OBJECT_SETREF (this_obj, MonthDayPattern, mono_string_new (domain, idx2string (dfe->month_day_pattern)));
- MONO_OBJECT_SETREF (this_obj, DayNames, create_names_array_idx (dfe->day_names, NUM_DAYS));
- MONO_OBJECT_SETREF (this_obj, AbbreviatedDayNames, create_names_array_idx (dfe->abbreviated_day_names,
- NUM_DAYS));
- MONO_OBJECT_SETREF (this_obj, SuperShortDayNames, create_names_array_idx (dfe->shortest_day_names, NUM_DAYS));
- MONO_OBJECT_SETREF (this_obj, MonthNames, create_names_array_idx (dfe->month_names, NUM_MONTHS));
- MONO_OBJECT_SETREF (this_obj, AbbreviatedMonthNames, create_names_array_idx (dfe->abbreviated_month_names,
- NUM_MONTHS));
- MONO_OBJECT_SETREF (this_obj, GenitiveMonthNames, create_names_array_idx (dfe->month_genitive_names, NUM_MONTHS));
- MONO_OBJECT_SETREF (this_obj, GenitiveAbbreviatedMonthNames, create_names_array_idx (dfe->abbreviated_month_genitive_names, NUM_MONTHS));
+ 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 (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 (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 (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 (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 (this_obj, AbbreviatedMonthNames, abbr_mon_names);
+
+
+ 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 (this_obj, GenitiveMonthNames, gen_month_names);
+
+ 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 (this_obj, GenitiveAbbreviatedMonthNames, gen_abbr_mon_names);
return TRUE;
}
void
ves_icall_System_Globalization_CultureData_fill_culture_data (MonoCultureData *this_obj, gint32 datetime_index)
{
+ MonoError error;
MonoDomain *domain;
const DateTimeFormatEntry *dfe;
MONO_OBJECT_SETREF (this_obj, AMDesignator, mono_string_new (domain, idx2string (dfe->am_designator)));
MONO_OBJECT_SETREF (this_obj, PMDesignator, mono_string_new (domain, idx2string (dfe->pm_designator)));
MONO_OBJECT_SETREF (this_obj, TimeSeparator, mono_string_new (domain, idx2string (dfe->time_separator)));
- MONO_OBJECT_SETREF (this_obj, LongTimePatterns, create_names_array_idx_dynamic (dfe->long_time_patterns,
- NUM_LONG_TIME_PATTERNS));
- MONO_OBJECT_SETREF (this_obj, ShortTimePatterns, create_names_array_idx_dynamic (dfe->short_time_patterns,
- NUM_SHORT_TIME_PATTERNS));
+
+ 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 (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 (this_obj, ShortTimePatterns, short_time_patterns);
this_obj->FirstDayOfWeek = dfe->first_day_of_week;
this_obj->CalendarWeekRule = dfe->calendar_week_rule;
}
void
ves_icall_System_Globalization_CultureData_fill_number_data (MonoNumberFormatInfo* number, gint32 number_index)
{
+ MonoError error;
MonoDomain *domain;
const NumberFormatEntry *nfe;
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));
+ MonoArray *currency_sizes_arr = create_group_sizes_array (nfe->currency_group_sizes,
+ GROUP_SIZE, &error);
+ if (mono_error_set_pending_exception (&error))
+ return;
+ MONO_OBJECT_SETREF (number, currencyGroupSizes, currency_sizes_arr);
number->currencyNegativePattern = nfe->currency_negative_pattern;
number->currencyPositivePattern = nfe->currency_positive_pattern;
MONO_OBJECT_SETREF (number, currencySymbol, mono_string_new (domain, idx2string (nfe->currency_symbol)));
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));
+ MonoArray *number_sizes_arr = create_group_sizes_array (nfe->number_group_sizes,
+ GROUP_SIZE, &error);
+ if (mono_error_set_pending_exception (&error))
+ return;
+ MONO_OBJECT_SETREF (number, numberGroupSizes, number_sizes_arr);
number->numberNegativePattern = nfe->number_negative_pattern;
number->percentNegativePattern = nfe->percent_negative_pattern;
number->percentPositivePattern = nfe->percent_positive_pattern;
}
static MonoBoolean
-construct_culture (MonoCultureInfo *this_obj, const CultureInfoEntry *ci)
+construct_culture (MonoCultureInfo *this_obj, const CultureInfoEntry *ci, MonoError *error)
{
MonoDomain *domain = mono_domain_get ();
+ mono_error_init (error);
+
this_obj->lcid = ci->lcid;
MONO_OBJECT_SETREF (this_obj, name, mono_string_new (domain, idx2string (ci->name)));
MONO_OBJECT_SETREF (this_obj, englishname, mono_string_new (domain, idx2string (ci->englishname)));
// It's null for neutral cultures
if (ci->territory > 0)
MONO_OBJECT_SETREF (this_obj, territory, mono_string_new (domain, idx2string (ci->territory)));
- MONO_OBJECT_SETREF (this_obj, native_calendar_names, create_names_array_idx (ci->native_calendar_names, NUM_CALENDARS));
+
+ MonoArray *native_calendar_names = create_names_array_idx (ci->native_calendar_names, NUM_CALENDARS, error);
+ return_val_if_nok (error, FALSE);
+ MONO_OBJECT_SETREF (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;
ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_lcid (MonoCultureInfo *this_obj,
gint lcid)
{
+ MonoError error;
const CultureInfoEntry *ci;
ci = culture_info_entry_from_lcid (lcid);
if(ci == NULL)
return FALSE;
- return construct_culture (this_obj, ci);
+ if (!construct_culture (this_obj, ci, &error)) {
+ mono_error_set_pending_exception (&error);
+ return FALSE;
+ }
+ return TRUE;
}
MonoBoolean
ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_name (MonoCultureInfo *this_obj,
MonoString *name)
{
+ MonoError error;
const CultureInfoNameEntry *ne;
char *n;
}
g_free (n);
- return construct_culture (this_obj, &culture_entries [ne->culture_entry_index]);
+ if (!construct_culture (this_obj, &culture_entries [ne->culture_entry_index], &error)) {
+ mono_error_set_pending_exception (&error);
+ return FALSE;
+ }
+ return TRUE;
}
/*
MonoBoolean
if (neutral)
len++;
- ret = mono_array_new (domain, klass, len);
+ ret = mono_array_new_checked (domain, klass, len, &error);
+ if (!is_ok (&error))
+ goto fail;
if (len == 0)
return ret;
is_neutral = ci->territory == 0;
if ((neutral && is_neutral) || (specific && !is_neutral)) {
culture = (MonoCultureInfo *) mono_object_new_checked (domain, klass, &error);
- mono_error_raise_exception (&error);
- mono_runtime_object_init ((MonoObject *) culture);
- construct_culture (culture, ci);
+ if (!is_ok (&error)) goto fail;
+ mono_runtime_object_init_checked ((MonoObject *) culture, &error);
+ if (!is_ok (&error)) goto fail;
+ if (!construct_culture (culture, ci, &error))
+ goto fail;
culture->use_user_override = TRUE;
mono_array_setref (ret, len++, culture);
}
}
return ret;
+
+fail:
+ mono_error_set_pending_exception (&error);
+ return ret;
}
int ves_icall_System_Globalization_CompareInfo_internal_compare (MonoCompareInfo *this_obj, MonoString *str1, gint32 off1, gint32 len1, MonoString *str2, gint32 off2, gint32 len2, gint32 options)
void ves_icall_System_Globalization_CompareInfo_assign_sortkey (MonoCompareInfo *this_obj, MonoSortKey *key, MonoString *source, gint32 options)
{
+ MonoError error;
MonoArray *arr;
gint32 keylen, i;
keylen=mono_string_length (source);
- arr=mono_array_new (mono_domain_get (), mono_get_byte_class (),
- keylen);
+ arr=mono_array_new_checked (mono_domain_get (), mono_get_byte_class (),
+ keylen, &error);
+ if (mono_error_set_pending_exception (&error))
+ return;
+
for(i=0; i<keylen; i++) {
mono_array_set (arr, guint8, i, mono_string_chars (source)[i]);
}
}
}
-void load_normalization_resource (guint8 **argProps,
- guint8 **argMappedChars,
- guint8 **argCharMapIndex,
- guint8 **argHelperIndex,
- guint8 **argMapIdxToComposite,
- guint8 **argCombiningClass)
+void ves_icall_System_Text_Normalization_load_normalization_resource (guint8 **argProps,
+ guint8 **argMappedChars,
+ guint8 **argCharMapIndex,
+ guint8 **argHelperIndex,
+ guint8 **argMapIdxToComposite,
+ guint8 **argCombiningClass)
{
#ifdef DISABLE_NORMALIZATION
mono_set_pending_exception (mono_get_exception_not_supported ("This runtime has been compiled without string normalization support."));