// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Collections.Generic;
using System.Text;
namespace System.Reflection.Runtime.MethodInfos
{
internal static partial class CustomMethodMapper
{
//
// String constructors require special casing down the stack, being the only variable-sized objects created via a constructor.
//
private static class StringActions
{
public static Dictionary<MethodBase, CustomMethodInvokerAction> Map
{
get
{
if (s_lazyMap == null)
{
Dictionary<MethodBase, CustomMethodInvokerAction> map = new Dictionary<MethodBase, CustomMethodInvokerAction>();
Type type = typeof(string);
unsafe
{
map.AddConstructor(type, new Type[] { typeof(char), typeof(int) },
(object thisObject, object[] args, Type thisType) =>
{
return new string((char)(args[0]), (int)(args[1]));
}
);
map.AddConstructor(type, new Type[] { typeof(char[]) },
(object thisObject, object[] args, Type thisType) =>
{
return new string((char[])(args[0]));
}
);
map.AddConstructor(type, new Type[] { typeof(char[]), typeof(int), typeof(int) },
(object thisObject, object[] args, Type thisType) =>
{
return new string((char[])(args[0]), (int)(args[1]), (int)(args[2]));
}
);
map.AddConstructor(type, new Type[] { typeof(char*) },
(object thisObject, object[] args, Type thisType) =>
{
return new string((char*)(IntPtr)(args[0]));
}
);
map.AddConstructor(type, new Type[] { typeof(char*), typeof(int), typeof(int) },
(object thisObject, object[] args, Type thisType) =>
{
return new string((char*)(IntPtr)(args[0]), (int)(args[1]), (int)(args[2]));
}
);
map.AddConstructor(type, new Type[] { typeof(sbyte*) },
(object thisObject, object[] args, Type thisType) =>
{
return new string((sbyte*)(IntPtr)(args[0]));
}
);
map.AddConstructor(type, new Type[] { typeof(sbyte*), typeof(int), typeof(int) },
(object thisObject, object[] args, Type thisType) =>
{
return new string((sbyte*)(IntPtr)(args[0]), (int)(args[1]), (int)(args[2]));
}
);
map.AddConstructor(type, new Type[] { typeof(sbyte*), typeof(int), typeof(int), typeof(Encoding) },
(object thisObject, object[] args, Type thisType) =>
{
return new string((sbyte*)(IntPtr)(args[0]), (int)(args[1]), (int)(args[2]), (Encoding)(args[3]));
}
);
}
s_lazyMap = map;
}
return s_lazyMap;
}
}
private static volatile Dictionary<MethodBase, CustomMethodInvokerAction> s_lazyMap;
}
}
}