using System.Collections.Generic;
using System.Diagnostics;
-using System.Runtime.InteropServices;
using System.Security;
using System.Text;
+using Internal.Runtime.CompilerServices;
namespace System.Globalization
{
{
datePatterns = null;
- CallbackContext callbackContext = new CallbackContext();
+ EnumCalendarsData callbackContext = new EnumCalendarsData();
+ callbackContext.Results = new List<string>();
callbackContext.DisallowDuplicates = true;
- bool result = EnumCalendarInfo(localeName, calendarId, dataType, callbackContext);
+ bool result = EnumCalendarInfo(localeName, calendarId, dataType, ref callbackContext);
if (result)
{
List<string> datePatternsList = callbackContext.Results;
{
monthNames = null;
- CallbackContext callbackContext = new CallbackContext();
- bool result = EnumCalendarInfo(localeName, calendarId, dataType, callbackContext);
+ EnumCalendarsData callbackContext = new EnumCalendarsData();
+ callbackContext.Results = new List<string>();
+ bool result = EnumCalendarInfo(localeName, calendarId, dataType, ref callbackContext);
if (result)
{
// the month-name arrays are expected to have 13 elements. If ICU only returns 12, add an
{
calendarData = null;
- CallbackContext callbackContext = new CallbackContext();
- bool result = EnumCalendarInfo(localeName, calendarId, dataType, callbackContext);
+ EnumCalendarsData callbackContext = new EnumCalendarsData();
+ callbackContext.Results = new List<string>();
+ bool result = EnumCalendarInfo(localeName, calendarId, dataType, ref callbackContext);
if (result)
{
calendarData = callbackContext.Results.ToArray();
return result;
}
- private static bool EnumCalendarInfo(string localeName, CalendarId calendarId, CalendarDataType dataType, CallbackContext callbackContext)
+ private static unsafe bool EnumCalendarInfo(string localeName, CalendarId calendarId, CalendarDataType dataType, ref EnumCalendarsData callbackContext)
{
- GCHandle context = GCHandle.Alloc(callbackContext);
- try
- {
- return Interop.GlobalizationInterop.EnumCalendarInfo(EnumCalendarInfoCallback, localeName, calendarId, dataType, (IntPtr)context);
- }
- finally
- {
- context.Free();
- }
+ return Interop.GlobalizationInterop.EnumCalendarInfo(EnumCalendarInfoCallback, localeName, calendarId, dataType, (IntPtr)Unsafe.AsPointer(ref callbackContext));
}
- private static void EnumCalendarInfoCallback(string calendarString, IntPtr context)
+ private static unsafe void EnumCalendarInfoCallback(string calendarString, IntPtr context)
{
try
{
- CallbackContext callbackContext = (CallbackContext)((GCHandle)context).Target;
+ ref EnumCalendarsData callbackContext = ref Unsafe.As<byte, EnumCalendarsData>(ref *(byte*)context);
if (callbackContext.DisallowDuplicates)
{
}
}
- private class CallbackContext
+ private struct EnumCalendarsData
{
- private List<string> _results = new List<string>();
-
- public CallbackContext()
- {
- }
-
- public List<string> Results { get { return _results; } }
-
- public bool DisallowDuplicates { get; set; }
+ public List<string> Results;
+ public bool DisallowDuplicates;
}
}
}