Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of OdinEye v1.2.31
plugins/OdinEye.dll
Decompiled 16 hours agousing System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.Specialized; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using OdinEye.Coroutines; using OdinEye.Events; using OdinEye.Extensions; using OdinEye.Http; using OdinEye.Http.Api.Controllers; using OdinEye.Http.WebSockets; using OdinEye.Logging; using OdinEye.Middlewares; using OdinEye.Models; using OdinEye.Models.Api; using OdinEye.Models.Proto; using ProtoBuf; using UnityEngine; using Utf8Json; using WebSocketSharp.Net; using WebSocketSharp.Server; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("OdinEye")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("OdinEye")] [assembly: AssemblyCopyright("Copyright © 2023")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: InternalsVisibleTo("OdinEye.Tests")] [assembly: Guid("6BC0320E-49F2-4A19-BE85-E909D6852C1C")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8.1", FrameworkDisplayName = ".NET Framework 4.8.1")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace OdinEye { [BepInPlugin("org.bepinex.plugins.odineye", "odineye", "1.0.0.0")] public class OdinEyePlugin : BaseUnityPlugin { private ConfigEntry<string> httpServerAddress; public static OdinEyePlugin Instance { get; private set; } public ILogger Logger { get; private set; } public OdinEye.Events.EventHandler EventHandler { get; private set; } public EventFeed EventFeed { get; private set; } public HttpWebServer HttpWebServer { get; private set; } public GameStatsSnapshotCoroutine StatsSnapshotCoroutine { get; private set; } private void Awake() { Instance = this; Logger = new Logger(((BaseUnityPlugin)this).Logger); Logger.LogInfo("OdinEye starting!"); LoadConfiguration(); try { HttpWebServer = new HttpWebServer(httpServerAddress.Value, Logger); } catch (Exception arg) { Logger.LogError($"Failed to start OdinEye's Http/WebSocket server at '{httpServerAddress.Value}': {arg}. " + "Check the [Hosting] HttpServerAddress setting in the org.bepinex.plugins.odineye.cfg config file. OdinEye's REST API and WebSocket event stream will be unavailable until this is fixed."); return; } try { SetupEventPipeline(); } catch (Exception arg2) { Logger.LogError($"Failed to initialize OdinEye's event pipeline: {arg2}. " + "OdinEye's WebSocket event stream will be unavailable until this is fixed."); return; } try { SetupHarmonyPatches(); } catch (Exception arg3) { Logger.LogError($"Failed to apply OdinEye's Harmony patches: {arg3}. " + "In-game event hooks (chat, world/player events, etc.) will not fire, but the REST API and WebSocket server remain available."); return; } Logger.LogInfo("OdinEye running!"); } private void LoadConfiguration() { httpServerAddress = ((BaseUnityPlugin)this).Config.Bind<string>("Hosting", "HttpServerAddress", "http://localhost:2469/", "The network address where the Http Server will be hosted"); } private void SetupHarmonyPatches() { //IL_000b: Unknown result type (might be due to invalid IL or missing references) Assembly executingAssembly = Assembly.GetExecutingAssembly(); new Harmony("org.bepinex.plugins.odineye").PatchAll(executingAssembly); } private void SetupEventPipeline() { StatsSnapshotCoroutine = new GameStatsSnapshotCoroutine(HttpWebServer); EventHandler = new OdinEye.Events.EventHandler(); EventFeed = new EventFeed(); EventHandler.Configure(delegate(EventHandlerConfigurationOptions options) { options.AddMiddleware(new ExceptionHandlerMiddleware(Logger)).AddMiddleware(new LoggingMiddleware(Logger)).AddMiddleware(new EventFeedMiddleware(EventFeed)) .AddMiddleware(new EventDispatcherMiddleware(HttpWebServer)); }); } } public static class MyPluginInfo { public const string PLUGIN_GUID = "OdinEye"; public const string PLUGIN_NAME = ""; public const string PLUGIN_VERSION = "1.0.0.0"; } } namespace OdinEye.Patches { [HarmonyPatch(typeof(Character))] public class CharacterDeathPatch { private static readonly FieldInfo NViewField = AccessTools.Field(typeof(Character), "m_nview"); private static readonly int? AttackersVarId = typeof(Character).Assembly.GetType("ZDOVars")?.GetField("s_attackers", BindingFlags.Static | BindingFlags.Public)?.GetValue(null) as int?; [HarmonyPatch("OnDeath")] [HarmonyPrefix] protected static void OnDeath(Character __instance) { if (__instance.IsPlayer() || !AttackersVarId.HasValue) { return; } object? value = NViewField.GetValue(__instance); ZNetView val = (ZNetView)((value is ZNetView) ? value : null); if (val != null && val.IsOwner()) { ZDO zdo = val.GetZDO(); string attackerKeyPrefix = AttackersVarId.Value.ToString(); List<string> list = (from p in ZNet.instance.GetPlayerList() where zdo.GetBool(attackerKeyPrefix + p.m_name, false) select p.m_name).ToList(); if (list.Count != 0) { string text = string.Join(", ", list) + " killed " + __instance.m_name + " " + $"(level {__instance.GetLevel()}, boss: {__instance.IsBoss()})"; Dictionary<string, object> dictionary = EnemyKillDetails.Build(__instance.m_name, __instance.GetLevel(), __instance.IsBoss(), list); OdinEyePlugin.Instance.EventHandler.Handle(GameEvent.New((EventType)300, text, (Player)null, (IDictionary<string, object>)dictionary)); } } } } [HarmonyPatch(typeof(Chat))] public class ChatPatch { [HarmonyPatch("OnNewChatMessage")] [HarmonyPrefix] protected static void OnNewChatMessage(GameObject go, long senderID, Vector3 pos, Type type, UserInfo sender, string text) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected I4, but got Unknown //IL_00cc: Unknown result type (might be due to invalid IL or missing references) string text2 = "user " + sender.Name + " said: " + text; switch ((int)type) { case 0: OdinEyePlugin.Instance.EventHandler.Handle(GameEvent.New((EventType)5, "CHAT WHISPER " + text2, (Player)null)); break; case 1: OdinEyePlugin.Instance.EventHandler.Handle(GameEvent.New((EventType)5, "CHAT NORMAL " + text2, (Player)null)); break; case 2: OdinEyePlugin.Instance.EventHandler.Handle(GameEvent.New((EventType)5, "CHAT SHOUT " + text2, (Player)null)); break; case 3: OdinEyePlugin.Instance.EventHandler.Handle(GameEvent.New((EventType)5, "PING " + text2, (Player)null)); break; default: OdinEyePlugin.Instance.EventHandler.Handle(GameEvent.New((EventType)5, $"Unknown chat type {type}", (Player)null)); break; } } } [HarmonyPatch(typeof(EnvMan))] public class EnvManPatch { [HarmonyPatch("UpdateTriggers")] [HarmonyPrefix] protected static void UpdateTriggers(float oldDayFraction, float newDayFraction, Biome biome, float dt) { if (ZNet.instance.m_peers.Count != 0) { if ((double)oldDayFraction > 0.20000000298023224 && (double)oldDayFraction < 0.25 && (double)newDayFraction > 0.25 && (double)newDayFraction < 0.30000001192092896) { int currentDay = EnvMan.instance.GetCurrentDay(); OdinEyePlugin.Instance.EventHandler.Handle(GameEvent.New((EventType)200, $"MORNING STARTED, day: {currentDay}", (Player)null)); } if (!((double)oldDayFraction <= 0.699999988079071) && !((double)oldDayFraction >= 0.75) && !((double)newDayFraction <= 0.75) && !((double)newDayFraction >= 0.800000011920929)) { OdinEyePlugin.Instance.EventHandler.Handle(GameEvent.New((EventType)201, "EVENING STARTED", (Player)null)); } } } } [HarmonyPatch(typeof(Game))] public class GamePatch { [HarmonyPatch("Awake")] [HarmonyPrefix] protected static void Awake() { OdinEyePlugin.Instance.EventHandler.Handle(GameEvent.New((EventType)50, "Game.Awake (server launch?)", (Player)null)); } [HarmonyPatch("OnApplicationQuit")] [HarmonyPrefix] protected static void OnApplicationQuit() { OdinEyePlugin.Instance.EventHandler.Handle(GameEvent.New((EventType)51, "Game.OnApplicationQuit (server stop?)", (Player)null)); } [HarmonyPatch("SleepStart")] [HarmonyPrefix] protected static void SleepStart(long sender) { string text = string.Join(", ", ZNet.instance.m_peers.Select((ZNetPeer p) => p.m_playerName)); string text2 = "Players " + text + " went to sleep"; OdinEyePlugin.Instance.EventHandler.Handle(GameEvent.New((EventType)6, text2, (Player)null)); } [HarmonyPatch("SleepStop")] [HarmonyPrefix] protected static void SleepStop(long sender) { string text = string.Join(", ", ZNet.instance.m_peers.Select((ZNetPeer p) => p.m_playerName)); string text2 = "Players " + text + " woke up"; OdinEyePlugin.Instance.EventHandler.Handle(GameEvent.New((EventType)7, text2, (Player)null)); } } [HarmonyPatch(typeof(RandomEvent))] public class RandomEventPatch { [HarmonyPatch("OnActivate")] [HarmonyPrefix] protected static void OnActivate(RandomEvent __instance) { OdinEyePlugin.Instance.EventHandler.Handle(GameEvent.New((EventType)100, $"RandomEvent.OnActivate: {__instance.m_name} active for {__instance.m_duration}", (Player)null)); } [HarmonyPatch("OnDeactivate")] [HarmonyPrefix] protected static void OnDeactivate(RandomEvent __instance) { OdinEyePlugin.Instance.EventHandler.Handle(GameEvent.New((EventType)101, $"RandomEvent.OnDeactivate: {__instance.m_name} was active for {__instance.m_duration}", (Player)null)); } } [HarmonyPatch(typeof(RandEventSystem))] public class RandomEventSystemPatch { [HarmonyPatch("SetRandomEvent")] [HarmonyPostfix] protected static void OnSetRandomEvent(RandomEvent ev, Vector3 pos) { if (ev != null) { OdinEyePlugin.Instance.EventHandler.Handle(GameEvent.New((EventType)102, "SetRandomEvent: " + ev.m_name + " - " + ev.m_startMessage, (Player)null)); } } } [HarmonyPatch(typeof(Talker))] public class TalkerPatch { [HarmonyPatch("RPC_Say")] [HarmonyPrefix] protected static void Say(long sender, int ctype, UserInfo user, string text) { OdinEyePlugin.Instance.EventHandler.Handle(GameEvent.New((EventType)5, "Talker.Say: " + user.Name + " - " + text, (Player)null)); } } [HarmonyPatch(typeof(ZNet))] public class ZNetPatch { private static HashSet<ZDOID> deadPlayers = new HashSet<ZDOID>(); [HarmonyPatch("RPC_PeerInfo")] [HarmonyPostfix] protected static void RPC_PeerInfo(ZNet __instance, ZRpc rpc, ZPackage pkg) { ZNetPeer peer = __instance.GetPeer(rpc); if (__instance.m_zdoMan.m_peers.Any((ZDOPeer zdoPeer) => zdoPeer.m_peer == peer)) { OdinEyePlugin.Instance.EventHandler.Handle(GameEvent.New((EventType)1, "Player has joined: " + peer.m_playerName, peer.ToPlayer())); } } [HarmonyPatch("RPC_CharacterID")] [HarmonyPostfix] protected static void OnRPCCharId(ZNet __instance, ZRpc rpc) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) ZNetPeer peer = __instance.GetPeer(rpc); if (peer.m_characterID != ZDOID.None) { OdinEyePlugin.Instance.EventHandler.Handle(GameEvent.New((EventType)2, "Player has spawned: " + peer.m_playerName, peer.ToPlayer())); } } [HarmonyPatch("RPC_Disconnect")] [HarmonyPrefix] protected static void Disco(ZNet __instance, ZRpc rpc) { ZNetPeer peer = __instance.GetPeer(rpc); OdinEyePlugin.Instance.EventHandler.Handle(GameEvent.New((EventType)4, "Player disconnected: " + peer.m_playerName, peer.ToPlayer())); } [HarmonyPatch("LoadWorld")] [HarmonyPostfix] protected static void OnLoadWorld(ZNet __instance) { OdinEyePlugin.Instance.EventHandler.Handle(GameEvent.New((EventType)53, "World loaded!", (Player)null)); ((MonoBehaviour)__instance).StartCoroutine(OdinEyePlugin.Instance.StatsSnapshotCoroutine.SendGameStatsSnapshotCoroutine()); } [HarmonyPatch("SaveWorld")] [HarmonyPostfix] protected static void SaveWorld() { OdinEyePlugin.Instance.EventHandler.Handle(GameEvent.New((EventType)54, "World was saved!", (Player)null)); } [HarmonyPatch("Shutdown")] [HarmonyPrefix] protected static void OnShutdown() { OdinEyePlugin.Instance.EventHandler.Handle(GameEvent.New((EventType)55, "Shutdown triggered!", (Player)null)); } [HarmonyPatch("SendPeriodicData")] [HarmonyPrefix] protected static void SendPeriodicData(ZNet __instance) { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) foreach (ZNetPeer peer in __instance.m_peers) { if (!peer.IsReady() || ((ZDOID)(ref peer.m_characterID)).IsNone()) { continue; } ZDO zDO = ZDOMan.instance.GetZDO(peer.m_characterID); if (zDO == null) { break; } if (zDO.GetBool(ZDOVars.s_dead, false)) { if (deadPlayers.Add(zDO.m_uid)) { OdinEyePlugin.Instance.EventHandler.Handle(GameEvent.New((EventType)3, "Player died: " + peer.m_playerName, (Player)null)); } } else { deadPlayers.Remove(zDO.m_uid); } } } } [HarmonyPatch(typeof(ZoneSystem))] public class ZoneSystemPatch { [HarmonyPatch("RPC_SetGlobalKey")] [HarmonyPrefix] protected static void RPC_SetGlobalKey(string name) { OdinEyePlugin.Instance.EventHandler.Handle(GameEvent.New((EventType)56, "GlobalKey added: " + name, (Player)null)); } [HarmonyPatch("RPC_RemoveGlobalKey")] [HarmonyPrefix] protected static void RPC_RemoveGlobalKey(string name) { OdinEyePlugin.Instance.EventHandler.Handle(GameEvent.New((EventType)57, "GlobalKey removed: " + name, (Player)null)); } } } namespace OdinEye.Models { public class Peer { public string CharacterId { get; set; } public string SteamId { get; set; } public string Name { get; set; } public float Health { get; set; } public float MaxHealth { get; set; } public float Stamina { get; set; } } } namespace OdinEye.Middlewares { public class EventDispatcherMiddleware : EventMiddleware { private readonly HttpWebServer httpWebServer; public EventDispatcherMiddleware(HttpWebServer httpWebServer) { this.httpWebServer = httpWebServer; } protected override void Invoke(GameEvent gameEvent, MiddlewareDelegate next) { httpWebServer.BroadcastWebSocketMessage<GameEvent>(gameEvent); } } public class EventFeedMiddleware : EventMiddleware { private readonly EventFeed feed; public EventFeedMiddleware(EventFeed feed) { this.feed = feed; } protected override void Invoke(GameEvent gameEvent, MiddlewareDelegate next) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) if (EventFeed.ShouldRecord(gameEvent.Type)) { feed.Append(gameEvent); } next(gameEvent); } } public class ExceptionHandlerMiddleware : EventMiddleware { private readonly ILogger logger; public ExceptionHandlerMiddleware(ILogger logger) { this.logger = logger; } protected override void Invoke(GameEvent gameEvent, MiddlewareDelegate next) { try { next(gameEvent); } catch (Exception ex) { logger.LogError("Error while handling game event: " + ex.Message); } } } public interface IEventMiddleware { IEventMiddleware SetNext(EventMiddleware handler); void Handle(GameEvent gameEvent); } public delegate void MiddlewareDelegate(GameEvent gameEvent); public abstract class EventMiddleware : IEventMiddleware { private MiddlewareDelegate next; public IEventMiddleware SetNext(EventMiddleware handler) { next = handler.InvokeWithNextDelegate; return handler; } public void Handle(GameEvent gameEvent) { Invoke(gameEvent, next); } protected abstract void Invoke(GameEvent gameEvent, MiddlewareDelegate next); private void InvokeWithNextDelegate(GameEvent gameEvent) { Invoke(gameEvent, next ?? ((MiddlewareDelegate)delegate { })); } } public class LoggingMiddleware : EventMiddleware { private readonly ILogger logger; public LoggingMiddleware(ILogger logger) { this.logger = logger; } protected override void Invoke(GameEvent gameEvent, MiddlewareDelegate next) { logger.LogInfo("Handling game event: " + gameEvent.Message); next(gameEvent); } } } namespace OdinEye.Logging { public interface ILogger { void LogFatal(object data); void LogError(object data); void LogWarning(object data); void LogMessage(object data); void LogInfo(object data); void LogDebug(object data); } public class Logger : ILogger { private readonly ManualLogSource manualLogSource; public Logger(ManualLogSource manualLogSource) { this.manualLogSource = manualLogSource; } public void LogFatal(object data) { manualLogSource.Log((LogLevel)1, data); } public void LogError(object data) { manualLogSource.Log((LogLevel)2, data); } public void LogWarning(object data) { manualLogSource.Log((LogLevel)4, data); } public void LogMessage(object data) { manualLogSource.Log((LogLevel)8, data); } public void LogInfo(object data) { manualLogSource.Log((LogLevel)16, data); } public void LogDebug(object data) { manualLogSource.Log((LogLevel)32, data); } } } namespace OdinEye.Http { public class HttpWebServer { private const string DefaultWebSocketPath = "/activity"; private readonly HttpServer httpServer; private readonly ILogger logger; private WebSocketSessionManager defaultWebSocketSessionManager; private IEnumerable<object> controllers = new object[11] { new PlayersController(), new ServerDetailsController(), new WorldDetailsController(), new BossDetailsController(), new WorldModifiersController(), new CharacterStatsController(), new CheatStatusController(), new PlayerNotifyController(), new EventsController(), new PlayersMetaController(), new PlayerEventsController() }; public HttpWebServer(string address, ILogger logger) { //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Expected O, but got Unknown this.logger = logger; logger.LogInfo("Starting Http Server at " + address); httpServer = new HttpServer(address); ConfigureHttpApi(); ConfigureWebSocketServices(); httpServer.Start(); } private void ConfigureHttpApi() { httpServer.OnGet += delegate(object sender, HttpRequestEventArgs args) { foreach (object controller2 in controllers) { if (controller2 is IController controller && string.Equals(controller.Route, RoutePath(args.Request.RawUrl))) { try { controller.OnGet(args); break; } catch (Exception arg) { logger.LogError($"Unhandled exception in {controller2.GetType().Name} for {args.Request.RawUrl}: {arg}"); args.Response.Error(); break; } } } }; httpServer.OnPost += delegate(object sender, HttpRequestEventArgs args) { foreach (object controller3 in controllers) { if (controller3 is IPostController postController) { string rawUrl = args.Request.RawUrl; int num = postController.RoutePrefix.Length + postController.RouteSuffix.Length; if (rawUrl.Length > num && rawUrl.StartsWith(postController.RoutePrefix) && rawUrl.EndsWith(postController.RouteSuffix)) { string routeParameter = rawUrl.Substring(postController.RoutePrefix.Length, rawUrl.Length - postController.RoutePrefix.Length - postController.RouteSuffix.Length); try { postController.OnPost(args, routeParameter); break; } catch (Exception arg) { logger.LogError($"Unhandled exception in {controller3.GetType().Name} for {args.Request.RawUrl}: {arg}"); args.Response.Error(); break; } } } } }; } internal static string RoutePath(string rawUrl) { int num = rawUrl?.IndexOf('?') ?? (-1); if (num >= 0) { return rawUrl.Substring(0, num); } return rawUrl; } private void ConfigureWebSocketServices() { httpServer.AddWebSocketService<ActivityWebSocketService>("/activity"); httpServer.KeepClean = true; defaultWebSocketSessionManager = httpServer.WebSocketServices["/activity"].Sessions; } public void BroadcastWebSocketMessage<TInstance>(TInstance instance) { using MemoryStream memoryStream = new MemoryStream(); Serializer.Serialize<TInstance>((Stream)memoryStream, instance); memoryStream.Seek(0L, SeekOrigin.Begin); defaultWebSocketSessionManager.Broadcast((Stream)memoryStream, (int)memoryStream.Length); } } } namespace OdinEye.Http.WebSockets { public class ActivityWebSocketService : WebSocketBehavior { } } namespace OdinEye.Http.Api.Controllers { public class BossDetailsController : IController { private const string DefeatedKey = "defeated_"; private const string ActiveBossesKey = "activebosses"; private readonly IEnumerable<(string, string)> bossNameKeys = new(string, string)[6] { ("Eikthyr", "eikthyr"), ("The Elder", "gdking"), ("Bonemass", "bonemass"), ("Moder", "dragon"), ("Yagluth", "goblinking"), ("The Queen", "queen") }; public string Route => "/bossDetails"; public void OnGet(HttpRequestEventArgs requestArguments) { //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Expected O, but got Unknown string value = ZoneSystem.instance.m_globalKeysValues.FirstOrDefault((KeyValuePair<string, string> kvp) => kvp.Key == "activebosses").Value; HashSet<string> defeatedKeys = (from kvp in ZoneSystem.instance.m_globalKeysValues where kvp.Key.StartsWith("defeated_") select kvp.Key).ToHashSet(); BossDetails instance = new BossDetails { ActiveBosses = ((value != null) ? int.Parse(value) : 0), Bosses = GetBosses(defeatedKeys) }; requestArguments.Response.Ok<BossDetails>(instance); } private IEnumerable<Boss> GetBosses(ICollection<string> defeatedKeys) { foreach (var (name, text) in bossNameKeys) { yield return new Boss { Key = text, Name = name, IsDefeated = defeatedKeys.Contains("defeated_" + text) }; } } } public class CharacterStatsController : IController, IPostController { private static readonly DateTime ValheimReleaseDate = new DateTime(2021, 2, 2, 0, 0, 0, DateTimeKind.Utc); private static readonly ConcurrentDictionary<string, ConcurrentDictionary<string, float>> StatsByPlayerId = new ConcurrentDictionary<string, ConcurrentDictionary<string, float>>(); internal static readonly ConcurrentDictionary<string, SubmissionMeta> MetaByPlayerId = new ConcurrentDictionary<string, SubmissionMeta>(); public string Route => "/players/stats"; public string RoutePrefix => "/players/"; public string RouteSuffix => "/stats"; public void OnGet(HttpRequestEventArgs requestArguments) { Dictionary<string, IReadOnlyDictionary<string, float>> instance = ((IEnumerable<KeyValuePair<string, ConcurrentDictionary<string, float>>>)StatsByPlayerId).ToDictionary((Func<KeyValuePair<string, ConcurrentDictionary<string, float>>, string>)((KeyValuePair<string, ConcurrentDictionary<string, float>> player) => player.Key), (Func<KeyValuePair<string, ConcurrentDictionary<string, float>>, IReadOnlyDictionary<string, float>>)((KeyValuePair<string, ConcurrentDictionary<string, float>> player) => new Dictionary<string, float>(player.Value))); requestArguments.Response.Ok(instance); } public void OnPost(HttpRequestEventArgs requestArguments, string routeParameter) { //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_019a: Expected O, but got Unknown if (!Guid.TryParse(routeParameter, out var result)) { requestArguments.Response.Error(400); return; } if (!IsConnectedPlayer(result)) { requestArguments.Response.Error(404); return; } CharacterStatsSubmission val; try { val = JsonSerializer.Deserialize<CharacterStatsSubmission>(requestArguments.Request.InputStream); } catch { requestArguments.Response.Error(400); return; } if (((val != null) ? val.Stats : null) == null || val.Stats.Count == 0) { requestArguments.Response.Error(400); return; } string key = result.ToString(); ConcurrentDictionary<string, float> orAdd = StatsByPlayerId.GetOrAdd(key, (string _) => new ConcurrentDictionary<string, float>()); foreach (KeyValuePair<string, float> stat in val.Stats) { orAdd.TryGetValue(stat.Key, out var value); if (!IsValidStatValue(stat.Value, value)) { requestArguments.Response.Error(400); return; } } foreach (KeyValuePair<string, float> stat2 in val.Stats) { orAdd[stat2.Key] = stat2.Value; } if (TryCleanMeta(val.Meta, out var clean)) { MetaByPlayerId[key] = clean; } requestArguments.Response.Ok<AcceptedResponse>(new AcceptedResponse()); } private static bool IsConnectedPlayer(Guid playerId) { return ZNet.instance.m_peers.Any((ZNetPeer peer) => peer.ToPlayer().Id == playerId); } internal static bool TryCleanMeta(SubmissionMeta meta, out SubmissionMeta clean) { //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Expected O, but got Unknown clean = null; if (meta == null || string.IsNullOrEmpty(meta.PlayerId) || !long.TryParse(meta.PlayerId, out var result)) { return false; } string text = meta.ClientVersion; if (text != null && (text.Length > 32 || !text.All((char c) => char.IsLetterOrDigit(c) || c == '.' || c == '-' || c == '+'))) { text = null; } clean = new SubmissionMeta { PlayerId = result.ToString(), ClientVersion = text }; return true; } internal static bool IsValidStatValue(float value, float previousValue) { if (float.IsNaN(value) || float.IsInfinity(value) || value < 0f) { return false; } float num = (float)(DateTime.UtcNow - ValheimReleaseDate).TotalSeconds; if (value > num) { return false; } return value >= previousValue; } } public class CheatStatusController : IController, IPostController { private static readonly ConcurrentDictionary<string, CheatStatusSubmission> StatusByPlayerId = new ConcurrentDictionary<string, CheatStatusSubmission>(); public string Route => "/players/cheatStatus"; public string RoutePrefix => "/players/"; public string RouteSuffix => "/cheatStatus"; public void OnGet(HttpRequestEventArgs requestArguments) { requestArguments.Response.Ok(new Dictionary<string, CheatStatusSubmission>(StatusByPlayerId)); } public void OnPost(HttpRequestEventArgs requestArguments, string routeParameter) { //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Expected O, but got Unknown if (!Guid.TryParse(routeParameter, out var result)) { requestArguments.Response.Error(400); return; } if (!IsConnectedPlayer(result)) { requestArguments.Response.Error(404); return; } CheatStatusSubmission val; try { val = JsonSerializer.Deserialize<CheatStatusSubmission>(requestArguments.Request.InputStream); } catch { requestArguments.Response.Error(400); return; } if (val == null) { requestArguments.Response.Error(400); return; } StatusByPlayerId[result.ToString()] = val; requestArguments.Response.Ok<AcceptedResponse>(new AcceptedResponse()); } private static bool IsConnectedPlayer(Guid playerId) { return ZNet.instance.m_peers.Any((ZNetPeer peer) => peer.ToPlayer().Id == playerId); } } public class EventsController : IController { public string Route => "/events"; public void OnGet(HttpRequestEventArgs requestArguments) { NameValueCollection queryString = requestArguments.Request.QueryString; EventsQuery.Parse(queryString["after"], queryString["limit"], out var after, out var limit); requestArguments.Response.Ok(OdinEyePlugin.Instance.EventFeed.Read(after, limit)); } } public interface IController { string Route { get; } void OnGet(HttpRequestEventArgs requestArguments); } public interface IPostController { string RoutePrefix { get; } string RouteSuffix { get; } void OnPost(HttpRequestEventArgs requestArguments, string routeParameter); } public class PlayerNotifyController : IPostController { private const int MessageTypeCenter = 2; private const int MaxMessageLength = 200; public string RoutePrefix => "/players/"; public string RouteSuffix => "/notify"; internal static bool IsValidSteamId(string steamId) { if (!string.IsNullOrEmpty(steamId)) { return steamId.All(char.IsDigit); } return false; } internal static bool IsValidMessage(string message) { if (!string.IsNullOrWhiteSpace(message)) { return message.Length <= 200; } return false; } public void OnPost(HttpRequestEventArgs requestArguments, string routeParameter) { //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Expected O, but got Unknown if (!IsValidSteamId(routeParameter)) { requestArguments.Response.Error(400); return; } NotifyRequest val; try { val = JsonSerializer.Deserialize<NotifyRequest>(requestArguments.Request.InputStream); } catch { requestArguments.Response.Error(400); return; } if (val == null || !IsValidMessage(val.Message)) { requestArguments.Response.Error(400); return; } ZNetPeer val2 = ((IEnumerable<ZNetPeer>)ZNet.instance.m_peers).FirstOrDefault((Func<ZNetPeer, bool>)((ZNetPeer p) => p.ToPlayer().SteamId == routeParameter)); if (val2 == null) { requestArguments.Response.Error(404); return; } ZRoutedRpc.instance.InvokeRoutedRPC(val2.m_uid, "ShowMessage", new object[2] { 2, val.Message }); requestArguments.Response.Ok<AcceptedResponse>(new AcceptedResponse()); } } public class PlayerEventsController : IPostController { internal static readonly ClientEventRateLimiter RateLimiter = new ClientEventRateLimiter(20, TimeSpan.FromMinutes(1.0)); public string RoutePrefix => "/players/"; public string RouteSuffix => "/events"; public void OnPost(HttpRequestEventArgs requestArguments, string routeParameter) { //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_012a: Expected O, but got Unknown if (!Guid.TryParse(routeParameter, out var playerId)) { requestArguments.Response.Error(400); return; } ZNetPeer val = ((IEnumerable<ZNetPeer>)ZNet.instance.m_peers).FirstOrDefault((Func<ZNetPeer, bool>)((ZNetPeer p) => p.ToPlayer().Id == playerId)); if (val == null) { requestArguments.Response.Error(404); return; } ClientEventsSubmission submission; try { submission = JsonSerializer.Deserialize<ClientEventsSubmission>(requestArguments.Request.InputStream); } catch { requestArguments.Response.Error(400); return; } Player player = val.ToPlayer(); if (!ClientEventCleaner.TryClean(submission, player, out var events)) { requestArguments.Response.Error(400); return; } if (!RateLimiter.TryAcquire(playerId.ToString(), events.Count, DateTime.UtcNow)) { requestArguments.Response.Error(429); return; } foreach (GameEvent item in events) { OdinEyePlugin.Instance.EventHandler.Handle(item); } requestArguments.Response.Ok<AcceptedResponse>(new AcceptedResponse()); } } public class PlayersMetaController : IController { public string Route => "/players/meta"; public void OnGet(HttpRequestEventArgs requestArguments) { requestArguments.Response.Ok(new Dictionary<string, SubmissionMeta>(CharacterStatsController.MetaByPlayerId)); } } public class PlayersController : IController { public string Route => "/players"; public void OnGet(HttpRequestEventArgs requestArguments) { IEnumerable<Peer> allPeers = ZNet.instance.GetAllPeers(); requestArguments.Response.Ok(allPeers.ToDto()); } } public class ServerDetailsController : IController { public string Route => "/serverDetails"; public void OnGet(HttpRequestEventArgs requestArguments) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown ServerDetails instance = new ServerDetails { MaxNumberOfPlayers = 10, GameVersion = Version.GetVersionString(false), SteamAppId = SteamManager.APP_ID.ToString() }; requestArguments.Response.Ok<ServerDetails>(instance); } } public class WorldDetailsController : IController { public string Route => "/worldDetails"; public void OnGet(HttpRequestEventArgs requestArguments) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Expected O, but got Unknown WorldDetails instance = new WorldDetails { DayNumber = EnvMan.instance.GetCurrentDay(), DayCycle = GetDayCycle(), NetTime = ZNet.instance.GetTimeSeconds(), WorldName = ZNet.instance.GetWorldName(), SeedName = ZNet.m_world.m_seedName, WorldKeys = ZNet.m_world.m_startingGlobalKeys, GlobalKeys = GetGlobalKeys() }; requestArguments.Response.Ok<WorldDetails>(instance); } private string GetDayCycle() { if (EnvMan.instance.IsNightSafe()) { return "night"; } if (EnvMan.instance.IsDaySafe()) { if (!EnvMan.instance.IsAfternoonSafe()) { return "morning"; } return "afternoon"; } return "unknown"; } private IEnumerable<GlobalKey> GetGlobalKeys() { if (ZoneSystem.instance.m_globalKeysValues.Count != 0) { return ((IEnumerable<KeyValuePair<string, string>>)ZoneSystem.instance.m_globalKeysValues).Select((Func<KeyValuePair<string, string>, GlobalKey>)((KeyValuePair<string, string> key) => new GlobalKey { Name = key.Key, Value = key.Value })); } return Enumerable.Empty<GlobalKey>(); } } public class WorldModifiersController : IController { private static readonly string[] Categories = new string[5] { "combat", "deathpenalty", "resources", "raids", "portals" }; public string Route => "/worldModifiers"; public void OnGet(HttpRequestEventArgs requestArguments) { //IL_0153: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_0160: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Expected O, but got Unknown //IL_0202: Unknown result type (might be due to invalid IL or missing references) //IL_0207: Unknown result type (might be due to invalid IL or missing references) //IL_020e: Unknown result type (might be due to invalid IL or missing references) //IL_021a: Expected O, but got Unknown //IL_0112: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_012f: Expected O, but got Unknown //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Expected O, but got Unknown List<WorldModifierValue> list = new List<WorldModifierValue>(); string value = null; string text = null; if ((Object)(object)ZoneSystem.instance != (Object)null && ZoneSystem.instance.m_globalKeysValues.TryGetValue("preset", out value) && !string.IsNullOrEmpty(value)) { Dictionary<string, string> dictionary = new Dictionary<string, string>(); string[] array = value.Split(new char[1] { ':' }); for (int i = 0; i < array.Length; i++) { string[] array2 = array[i].Split(new char[1] { '_' }); if (array2.Length == 2) { dictionary[array2[0]] = array2[1]; } } if (Categories.All(dictionary.ContainsKey)) { array = Categories; foreach (string text2 in array) { list.Add(new WorldModifierValue { Category = text2, Value = dictionary[text2] }); } } else { text = value; array = Categories; foreach (string category in array) { list.Add(new WorldModifierValue { Category = category, Value = "unknown" }); } } } else { string[] array = Categories; foreach (string category2 in array) { list.Add(new WorldModifierValue { Category = category2, Value = "default" }); } } string summary; if (text != null) { summary = "Preset: " + text; } else { List<WorldModifierValue> list2 = list.Where((WorldModifierValue m) => m.Value != "default").ToList(); summary = ((list2.Count == 0) ? "Default" : string.Join(", ", list2.Select((WorldModifierValue m) => m.Category + ": " + m.Value))); } requestArguments.Response.Ok<WorldModifiersDetails>(new WorldModifiersDetails { Modifiers = list, Summary = summary }); } } } namespace OdinEye.Extensions { public static class EnvManExtensions { private static readonly MethodInfo IsDayMethod = GetBoolMethod("IsDay"); private static readonly MethodInfo IsNightMethod = GetBoolMethod("IsNight"); private static readonly MethodInfo IsAfternoonMethod = GetBoolMethod("IsAfternoon"); public static bool IsDaySafe(this EnvMan env) { return Invoke(IsDayMethod, env); } public static bool IsNightSafe(this EnvMan env) { return Invoke(IsNightMethod, env); } public static bool IsAfternoonSafe(this EnvMan env) { return Invoke(IsAfternoonMethod, env); } private static MethodInfo GetBoolMethod(string name) { return typeof(EnvMan).GetMethod(name, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public); } private static bool Invoke(MethodInfo method, EnvMan env) { if (method != null) { return (bool)method.Invoke(env, null); } return false; } } public static class HttpListenerResponseExtensions { public static void Ok<TInstance>(this HttpListenerResponse response, TInstance instance) { byte[] array = JsonSerializer.Serialize<TInstance>(instance); response.StatusCode = 200; response.ContentType = "application/json"; response.ContentLength64 = array.Length; response.ContentEncoding = Encoding.UTF8; response.OutputStream.Write(array, 0, array.Length); response.Close(); } public static void Error(this HttpListenerResponse response, int statusCode = 500) { byte[] bytes = Encoding.UTF8.GetBytes("An error occurred while handling this request."); response.StatusCode = statusCode; response.ContentType = "text/plain"; response.ContentLength64 = bytes.Length; response.ContentEncoding = Encoding.UTF8; response.OutputStream.Write(bytes, 0, bytes.Length); response.Close(); } } public static class PeerExtensions { public static IEnumerable<Player> ToDto(this IEnumerable<Peer> peers) { return peers.Select((Func<Peer, Player>)((Peer peer) => new Player { Id = NameBasedGuid.NewPlayerGuid(peer.SteamId, peer.Name), CharacterId = peer.CharacterId, Name = peer.Name, SteamId = peer.SteamId, Health = peer.Health, MaxHealth = peer.MaxHealth, Stamina = peer.Stamina })); } public static IEnumerable<PlayerStats> ToPlayerStats(this IEnumerable<Peer> peers) { return peers.Select((Func<Peer, PlayerStats>)((Peer peer) => new PlayerStats { Id = NameBasedGuid.NewPlayerGuid(peer.SteamId, peer.Name), CharacterId = peer.CharacterId, Health = peer.Health, MaxHealth = peer.MaxHealth, Stamina = peer.Stamina })); } } public static class ZNetExtensions { public static IEnumerable<Peer> GetAllPeers(this ZNet znet) { float health = default(float); float maxHealth = default(float); float stamina = default(float); foreach (ZNetPeer peer in znet.m_peers) { if (peer.IsReady() && !((ZDOID)(ref peer.m_characterID)).IsNone()) { ZDO zDO = ZDOMan.instance.GetZDO(peer.m_characterID); if (zDO != null) { zDO.GetFloat(ZDOVars.s_health, ref health); zDO.GetFloat(ZDOVars.s_maxHealth, ref maxHealth); zDO.GetFloat(ZDOVars.s_stamina, ref stamina); yield return new Peer { CharacterId = ((object)Unsafe.As<ZDOID, ZDOID>(ref peer.m_characterID)/*cast due to .constrained prefix*/).ToString(), Name = peer.m_playerName, SteamId = peer.m_socket.GetHostName(), Health = health, MaxHealth = maxHealth, Stamina = stamina }; } } } } } public static class ZNetPeerExtensions { public static Player ToPlayer(this ZNetPeer peer) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Expected O, but got Unknown return new Player { Id = NameBasedGuid.NewPlayerGuid(peer.m_socket.GetHostName(), peer.m_playerName), Name = peer.m_playerName, SteamId = peer.m_socket.GetHostName() }; } } } namespace OdinEye.Events { public class EventHandler { private IEventMiddleware rootMiddleware; public void Configure(Action<EventHandlerConfigurationOptions> configurator) { EventHandlerConfigurationOptions eventHandlerConfigurationOptions = new EventHandlerConfigurationOptions(); configurator(eventHandlerConfigurationOptions); rootMiddleware = eventHandlerConfigurationOptions.RootMiddleware; } public void Handle(GameEvent gameEvent) { rootMiddleware.Handle(gameEvent); } } public sealed class EventFeed { public const int DefaultCapacity = 5000; private readonly object gate = new object(); private readonly Queue<EventFeedEntry> entries = new Queue<EventFeedEntry>(); private readonly int capacity; private long nextSeq = 1L; public string BootId { get; } public EventFeed(int capacity = 5000, string bootId = null) { if (capacity <= 0) { throw new ArgumentOutOfRangeException("capacity", "Capacity must be positive."); } this.capacity = capacity; BootId = bootId ?? Guid.NewGuid().ToString(); } public static bool ShouldRecord(EventType type) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 return (int)type != 5; } public long Append(GameEvent gameEvent) { if (gameEvent == null) { throw new ArgumentNullException("gameEvent"); } lock (gate) { long num = nextSeq++; entries.Enqueue(EventFeedEntry.From(num, gameEvent)); while (entries.Count > capacity) { entries.Dequeue(); } return num; } } public EventFeedResult Read(long after, int limit) { if (limit <= 0) { limit = 1; } lock (gate) { long num = ((entries.Count > 0) ? entries.Peek().Seq : nextSeq); return new EventFeedResult { BootId = BootId, NextSeq = nextSeq, Gap = (num > after + 1), Events = entries.Where((EventFeedEntry e) => e.Seq > after).Take(limit).ToList() }; } } } public sealed class EventFeedResult { public string BootId { get; set; } public long NextSeq { get; set; } public bool Gap { get; set; } public List<EventFeedEntry> Events { get; set; } } public sealed class EventFeedEntry { public long Seq { get; set; } public string Ts { get; set; } public string Type { get; set; } public string Message { get; set; } public EventFeedPlayer Player { get; set; } public Dictionary<string, object> Data { get; set; } public static EventFeedEntry From(long seq, GameEvent gameEvent) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) return new EventFeedEntry { Seq = seq, Ts = ((Message)gameEvent).CreatedDate.ToUniversalTime().ToString("o"), Type = ((object)gameEvent.Type/*cast due to .constrained prefix*/).ToString(), Message = gameEvent.Message, Player = ((gameEvent.Player == null) ? null : new EventFeedPlayer { Id = gameEvent.Player.Id.ToString(), Name = gameEvent.Player.Name, SteamId = gameEvent.Player.SteamId }), Data = ((gameEvent.Details == null) ? new Dictionary<string, object>() : new Dictionary<string, object>(gameEvent.Details)) }; } } public sealed class EventFeedPlayer { public string Id { get; set; } public string Name { get; set; } public string SteamId { get; set; } } public static class EventsQuery { public const int DefaultLimit = 500; public const int MaxLimit = 1000; public static void Parse(string afterRaw, string limitRaw, out long after, out int limit) { after = ((long.TryParse(afterRaw, out var result) && result > 0) ? result : 0); limit = (int.TryParse(limitRaw, out var result2) ? Math.Max(1, Math.Min(1000, result2)) : 500); } } public static class ClientEventCleaner { public const int MaxEventsPerRequest = 20; private const float MaxCoordinate = 100000f; private static readonly HashSet<string> AllowedTypes = new HashSet<string>(StringComparer.Ordinal) { "BedRemoved", "BedMissingAtRespawn" }; public static bool TryClean(ClientEventsSubmission submission, Player player, out List<GameEvent> events) { events = null; if (((submission != null) ? submission.Events : null) == null || submission.Events.Count == 0 || submission.Events.Count > 20) { return false; } List<GameEvent> list = new List<GameEvent>(); foreach (ClientEvent @event in submission.Events) { GameEvent val = CleanOne(@event, player); if (val == null) { return false; } list.Add(val); } events = list; return true; } private static GameEvent CleanOne(ClientEvent clientEvent, Player player) { if (clientEvent == null || clientEvent.Type == null || !AllowedTypes.Contains(clientEvent.Type) || !IsSaneCoordinate(clientEvent.X) || !IsSaneCoordinate(clientEvent.Y) || !IsSaneCoordinate(clientEvent.Z)) { return null; } if (clientEvent.Type == "BedRemoved") { if (!long.TryParse(clientEvent.OwnerPlayerId, out var result) || !long.TryParse(clientEvent.RemoverPlayerId, out var result2)) { return null; } return GameEvent.New((EventType)400, "A claimed bed was removed with the hammer", player, (IDictionary<string, object>)new Dictionary<string, object> { ["OwnerPlayerId"] = result.ToString(), ["RemoverPlayerId"] = result2.ToString(), ["SpawnX"] = clientEvent.X, ["SpawnY"] = clientEvent.Y, ["SpawnZ"] = clientEvent.Z }); } return GameEvent.New((EventType)401, "A player respawned at the circle because their bed was gone", player, (IDictionary<string, object>)new Dictionary<string, object> { ["LostSpawnX"] = clientEvent.X, ["LostSpawnY"] = clientEvent.Y, ["LostSpawnZ"] = clientEvent.Z }); } private static bool IsSaneCoordinate(float value) { if (!float.IsNaN(value) && !float.IsInfinity(value)) { return Math.Abs(value) <= 100000f; } return false; } } public sealed class ClientEventRateLimiter { private readonly int maxPerWindow; private readonly TimeSpan window; private readonly Dictionary<string, Queue<DateTime>> recentByPlayer = new Dictionary<string, Queue<DateTime>>(); private readonly object gate = new object(); public ClientEventRateLimiter(int maxPerWindow, TimeSpan window) { if (maxPerWindow <= 0) { throw new ArgumentOutOfRangeException("maxPerWindow"); } if (window <= TimeSpan.Zero) { throw new ArgumentOutOfRangeException("window"); } this.maxPerWindow = maxPerWindow; this.window = window; } public bool TryAcquire(string playerKey, int count, DateTime nowUtc) { lock (gate) { if (!recentByPlayer.TryGetValue(playerKey, out var value)) { value = new Queue<DateTime>(); recentByPlayer[playerKey] = value; } while (value.Count > 0 && nowUtc - value.Peek() >= window) { value.Dequeue(); } if (value.Count + count > maxPerWindow) { return false; } for (int i = 0; i < count; i++) { value.Enqueue(nowUtc); } return true; } } } public static class EnemyKillDetails { public static Dictionary<string, object> Build(string enemyName, int level, bool isBoss, IEnumerable<string> attackers) { List<string> list = (attackers ?? Enumerable.Empty<string>()).Where((string n) => !string.IsNullOrEmpty(n)).Distinct().ToList(); return new Dictionary<string, object> { ["Enemy"] = enemyName, ["Level"] = level, ["Boss"] = isBoss, ["Attackers"] = list, ["Solo"] = list.Count == 1 }; } } public class EventHandlerConfigurationOptions { public IEventMiddleware RootMiddleware { get; private set; } public IEventMiddleware LastMiddleware { get; private set; } public EventHandlerConfigurationOptions AddMiddleware(EventMiddleware eventMiddleware) { if (RootMiddleware == null) { RootMiddleware = eventMiddleware; } LastMiddleware?.SetNext(eventMiddleware); LastMiddleware = eventMiddleware; return this; } } } namespace OdinEye.Coroutines { public class GameStatsSnapshotCoroutine { private readonly HttpWebServer httpWebServer; public GameStatsSnapshotCoroutine(HttpWebServer httpWebServer) { this.httpWebServer = httpWebServer; } public IEnumerator SendGameStatsSnapshotCoroutine() { while (true) { SendGameStatsSnapshot(); yield return (object)new WaitForSeconds(1f); } } private void SendGameStatsSnapshot() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Expected O, but got Unknown //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Expected O, but got Unknown WorldStats worldStats = new WorldStats { DayNumber = EnvMan.instance.GetCurrentDay(), DayCycle = (EnvMan.instance.IsDaySafe() ? "day" : "night") }; IEnumerable<PlayerStats> playerStats = ZNet.instance.GetAllPeers().ToPlayerStats(); GameStatsSnapshot instance = new GameStatsSnapshot { CreatedDate = DateTime.UtcNow, PlayerStats = playerStats, WorldStats = worldStats }; httpWebServer.BroadcastWebSocketMessage<GameStatsSnapshot>(instance); } } }
plugins/OdinEye.Models.dll
Decompiled 16 hours agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using NGuid; using ProtoBuf; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")] [assembly: AssemblyCompany("sparcopt")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+54bc12311450691a0ebdbd8b7a54cc3a57b8e72c")] [assembly: AssemblyProduct("OdinEye.Models")] [assembly: AssemblyTitle("OdinEye.Models")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/sparcopt/odin-eye")] [assembly: AssemblyVersion("1.0.0.0")] namespace OdinEye.Models { public static class NameBasedGuid { private static readonly Guid NamespaceId = new Guid("4b01a09a-9b18-493c-9877-4786611eeea2"); public static Guid NewPlayerGuid(string steamId, string playerName) { return GuidHelpers.CreateFromName(NamespaceId, steamId + playerName, 5); } } } namespace OdinEye.Models.Proto { public enum EventType { Unknown = 0, PlayerJoin = 1, PlayerSpawn = 2, PlayerDeath = 3, PlayerDisconnect = 4, PlayerChat = 5, PlayersSleepStart = 6, PlayerSleepStop = 7, GameAwake = 50, GameQuit = 51, WorldLoad = 53, WorldSave = 54, ServerShutdown = 55, GlobalKeyAdd = 56, GlobalKeyRemove = 57, RandomEventActivate = 100, RandomEventDeactivate = 101, RandomEventSet = 102, EnvironmentMorningStart = 200, EnvironmentEveningStart = 201, EnemyKilled = 300, BedRemoved = 400, BedMissingAtRespawn = 401 } [ProtoContract] public class GameEvent : Message { [ProtoMember(1)] public string Message { get; set; } [ProtoMember(2)] public EventType Type { get; set; } [ProtoMember(4)] public Player Player { get; set; } [ProtoMember(5)] public IDictionary<string, object> Data { get; set; } [ProtoIgnore] public IDictionary<string, object> Details { get; set; } public static GameEvent New(EventType type, string message, Player player = null) { return new GameEvent { CreatedDate = DateTime.UtcNow, Type = type, Message = message, Player = player }; } public static GameEvent New(EventType type, string message, Player player, IDictionary<string, object> details) { return new GameEvent { CreatedDate = DateTime.UtcNow, Type = type, Message = message, Player = player, Details = details }; } } [ProtoContract] public class GameStatsSnapshot : Message { [ProtoMember(1)] public IEnumerable<PlayerStats> PlayerStats { get; set; } = new List<PlayerStats>(); [ProtoMember(2)] public WorldStats WorldStats { get; set; } } [ProtoContract] [ProtoInclude(2, typeof(GameEvent))] [ProtoInclude(3, typeof(GameStatsSnapshot))] public class Message { [ProtoMember(1)] public DateTime CreatedDate { get; set; } } [ProtoContract] public class Player { [ProtoMember(1)] public Guid Id { get; set; } [ProtoMember(2)] public string CharacterId { get; set; } [ProtoMember(3)] public string SteamId { get; set; } [ProtoMember(4)] public string Name { get; set; } [ProtoMember(5)] public float Health { get; set; } [ProtoMember(6)] public float MaxHealth { get; set; } [ProtoMember(7)] public float Stamina { get; set; } } [ProtoContract] public class PlayerStats { [ProtoMember(1)] public Guid Id { get; set; } [ProtoMember(2)] public string CharacterId { get; set; } [ProtoMember(3)] public float Health { get; set; } [ProtoMember(4)] public float MaxHealth { get; set; } [ProtoMember(5)] public float Stamina { get; set; } } [ProtoContract] public class WorldStats { [ProtoMember(1)] public int DayNumber { get; set; } [ProtoMember(2)] public string DayCycle { get; set; } } } namespace OdinEye.Models.Api { public class AcceptedResponse { public bool Accepted { get; set; } = true; } public class Boss { public string Key { get; set; } public string Name { get; set; } public bool IsDefeated { get; set; } } public class BossDetails { public int ActiveBosses { get; set; } public IEnumerable<Boss> Bosses { get; set; } = Enumerable.Empty<Boss>(); } public class CharacterStatsSubmission { public Dictionary<string, float> Stats { get; set; } public SubmissionMeta Meta { get; set; } } public class SubmissionMeta { public string PlayerId { get; set; } public string ClientVersion { get; set; } } public class CheatStatusSubmission { public bool Cheated { get; set; } public bool BypassEnabled { get; set; } } public class ClientEventsSubmission { public List<ClientEvent> Events { get; set; } } public class ClientEvent { public string Type { get; set; } public string OwnerPlayerId { get; set; } public string RemoverPlayerId { get; set; } public float X { get; set; } public float Y { get; set; } public float Z { get; set; } } public class GlobalKey { public string Name { get; set; } public string Value { get; set; } } public class NotifyRequest { public string Message { get; set; } } public class Player { public Guid Id { get; set; } public string CharacterId { get; set; } public string SteamId { get; set; } public string Name { get; set; } public float Health { get; set; } public float MaxHealth { get; set; } public float Stamina { get; set; } } public class ServerDetails { public int MaxNumberOfPlayers { get; set; } public string GameVersion { get; set; } public string SteamAppId { get; set; } } public class WorldDetails { public int DayNumber { get; set; } public string DayCycle { get; set; } public double NetTime { get; set; } public string WorldName { get; set; } public string SeedName { get; set; } public IEnumerable<string> WorldKeys { get; set; } = Enumerable.Empty<string>(); public IEnumerable<GlobalKey> GlobalKeys { get; set; } = Enumerable.Empty<GlobalKey>(); } public class WorldModifiersDetails { public IEnumerable<WorldModifierValue> Modifiers { get; set; } = Enumerable.Empty<WorldModifierValue>(); public string Summary { get; set; } } public class WorldModifierValue { public string Category { get; set; } public string Value { get; set; } } }
plugins/NGuid.dll
Decompiled 16 hours agousing System; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Cryptography; using System.Security.Permissions; using System.Text; using Microsoft.CodeAnalysis; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")] [assembly: AssemblyCompany("Bradley Grainger")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyCopyright("Copyright 2023 Bradley Grainger")] [assembly: AssemblyDescription("Creates GUIDs according to RFC 4122 and the UUID Revision Working Draft.")] [assembly: AssemblyFileVersion("0.2.0.0")] [assembly: AssemblyInformationalVersion("0.2.0+0752fad0bd0c6f95ace49389bc01bdc07f7d6c59")] [assembly: AssemblyProduct("NGuid")] [assembly: AssemblyTitle("NGuid")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/bgrainger/NGuid.git")] [assembly: InternalsVisibleTo("NGuid.Tests")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace NGuid { public static class GuidHelpers { public static readonly Guid DnsNamespace = new Guid("6ba7b810-9dad-11d1-80b4-00c04fd430c8"); public static readonly Guid UrlNamespace = new Guid("6ba7b811-9dad-11d1-80b4-00c04fd430c8"); public static readonly Guid IsoOidNamespace = new Guid("6ba7b812-9dad-11d1-80b4-00c04fd430c8"); public static readonly Guid Sha256HashSpaceId = new Guid("3fb32780-953c-4464-9cfd-e85dbbe9843d"); public static readonly Guid Sha384HashSpaceId = new Guid("e6800581-f333-484b-8778-601ff2b58da8"); public static readonly Guid Sha512HashSpaceId = new Guid("0fde22f2-e7ba-4fd1-9753-9c2ea88fa3f9"); private static readonly DateTime s_gregorianEpoch = new DateTime(1582, 10, 15, 0, 0, 0, DateTimeKind.Utc); public static Guid CreateFromName(Guid namespaceId, string name, int version = 5) { if (name == null) { throw new ArgumentNullException("name"); } byte[] bytes = Encoding.UTF8.GetBytes(name); return CreateFromName(namespaceId, bytes, version); } public static Guid CreateFromName(Guid namespaceId, byte[] name, int version = 5) { if ((version != 3 && version != 5) || 1 == 0) { throw new ArgumentOutOfRangeException("version", version, "version must be either 3 or 5."); } byte[] array = namespaceId.ToByteArray(); SwapByteOrder(array); byte[] buffer = array.Concat(name).ToArray(); byte[] sourceArray; using (HashAlgorithm hashAlgorithm = ((version == 3) ? ((HashAlgorithm)MD5.Create()) : ((HashAlgorithm)SHA1.Create()))) { sourceArray = hashAlgorithm.ComputeHash(buffer); } byte[] array2 = new byte[16]; Array.Copy(sourceArray, 0, array2, 0, 16); array2[6] = (byte)((array2[6] & 0xF) | (version << 4)); array2[8] = (byte)((array2[8] & 0x3F) | 0x80); SwapByteOrder(array2); return new Guid(array2); } public static Guid CreateVersion6() { return CreateVersion6(DateTimeOffset.UtcNow); } private static Guid CreateVersion6(DateTimeOffset timestamp) { long ticks = (timestamp.UtcDateTime - s_gregorianEpoch).Ticks; if (ticks < 0) { throw new ArgumentOutOfRangeException("timestamp", timestamp, "The timestamp must be after 15 October 1582."); } uint a = (uint)(ticks >> 28); ushort b = (ushort)(ticks >> 12); ushort c = (ushort)((ticks & 0xFFF) | 0x6000); byte[] array = new byte[8]; using RandomNumberGenerator randomNumberGenerator = RandomNumberGenerator.Create(); randomNumberGenerator.GetBytes(array); return new Guid(a, b, c, (byte)((array[0] & 0x3F) | 0x80), array[1], array[2], array[3], array[4], array[5], array[6], array[7]); } public static Guid CreateVersion6FromVersion1(Guid guid) { byte[] array = guid.ToByteArray(); if ((array[7] & 0xF0) != 16) { throw new ArgumentException("The GUID must be a version 1 GUID.", "guid"); } ulong num = (ulong)((long)(array[7] & 0xF) << 56) | ((ulong)array[6] << 48) | ((ulong)array[5] << 40) | ((ulong)array[4] << 32) | ((ulong)array[3] << 24) | ((ulong)array[2] << 16) | ((ulong)array[1] << 8) | array[0]; array[3] = (byte)(num >> 52); array[2] = (byte)(num >> 44); array[1] = (byte)(num >> 36); array[0] = (byte)(num >> 28); array[5] = (byte)(num >> 20); array[4] = (byte)(num >> 12); array[7] = (byte)(0x60 | ((num >> 8) & 0xF)); array[6] = (byte)num; return new Guid(array); } public static Guid CreateVersion7() { return CreateVersion7(DateTimeOffset.UtcNow); } private static Guid CreateVersion7(DateTimeOffset timestamp) { long num = timestamp.ToUnixTimeMilliseconds(); if (num < 0) { throw new ArgumentOutOfRangeException("timestamp", timestamp, "The timestamp must be after 1 January 1970."); } uint a = (uint)(num >> 16); ushort b = (ushort)num; byte[] array = new byte[10]; using RandomNumberGenerator randomNumberGenerator = RandomNumberGenerator.Create(); randomNumberGenerator.GetBytes(array); ushort c = (ushort)(0x7000uL | (ulong)((array[0] & 0xF) << 8) | array[1]); return new Guid(a, b, c, (byte)((array[2] & 0x3F) | 0x80), array[3], array[4], array[5], array[6], array[7], array[8], array[9]); } public static Guid CreateVersion8(byte[] bytes) { if (bytes == null) { throw new ArgumentNullException("bytes"); } if (bytes.Length < 16) { throw new ArgumentException("At least sixteen bytes must be provided", "bytes"); } byte[] array = new byte[16]; bytes.AsSpan(0, 16).CopyTo(array); SwapByteOrder(array); array[7] = (byte)(0x80 | (array[7] & 0xF)); array[8] = (byte)(0x80 | (array[8] & 0x3F)); return new Guid(array); } public static Guid CreateVersion8FromName(HashAlgorithmName hashAlgorithmName, Guid namespaceId, byte[] name) { var (guid, hashAlgorithm) = GetHashSpaceAndAlgorithm(hashAlgorithmName); using (hashAlgorithm) { byte[] array = guid.ToByteArray(); SwapByteOrder(array); hashAlgorithm.TransformBlock(array, 0, array.Length, null, 0); byte[] array2 = namespaceId.ToByteArray(); SwapByteOrder(array2); hashAlgorithm.TransformBlock(array2, 0, array2.Length, null, 0); hashAlgorithm.TransformFinalBlock(name, 0, name.Length); byte[] array3 = new byte[16]; Array.Copy(hashAlgorithm.Hash, array3, 16); array3[6] = (byte)((array3[6] & 0xF) | 0x80); array3[8] = (byte)((array3[8] & 0x3F) | 0x80); SwapByteOrder(array3); return new Guid(array3); } } private static (Guid NamespaceId, HashAlgorithm Algorithm) GetHashSpaceAndAlgorithm(HashAlgorithmName hashAlgorithmName) { return hashAlgorithmName.Name switch { "SHA256" => (NamespaceId: Sha256HashSpaceId, Algorithm: SHA256.Create()), "SHA384" => (NamespaceId: Sha384HashSpaceId, Algorithm: SHA384.Create()), "SHA512" => (NamespaceId: Sha512HashSpaceId, Algorithm: SHA512.Create()), _ => throw new ArgumentException("Unsupported hash algorithm name: " + hashAlgorithmName.Name, "hashAlgorithmName"), }; } internal static void SwapByteOrder(Span<byte> guid) { SwapBytes(guid, 0, 3); SwapBytes(guid, 1, 2); SwapBytes(guid, 4, 5); SwapBytes(guid, 6, 7); } private static void SwapBytes(Span<byte> guid, int left, int right) { ref byte source = ref Unsafe.AsRef(in guid[0]); ref byte reference = ref Unsafe.Add(ref source, right); ref byte reference2 = ref Unsafe.Add(ref source, left); byte b = Unsafe.Add(ref source, left); byte b2 = Unsafe.Add(ref source, right); reference = b; reference2 = b2; } } }
plugins/Utf8Json.dll
Decompiled 16 hours ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.Dynamic; using System.Globalization; using System.IO; using System.Linq; using System.Linq.Expressions; using System.Numerics; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using Utf8Json.Formatters; using Utf8Json.Formatters.Internal; using Utf8Json.Internal; using Utf8Json.Internal.DoubleConversion; using Utf8Json.Internal.Emit; using Utf8Json.Resolvers; using Utf8Json.Resolvers.Internal; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("Utf8Json")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("929e3779-4c3a-42a3-bc72-3d77511e988f")] [assembly: AssemblyFileVersion("1.3.7")] [assembly: TargetFramework(".NETFramework,Version=v4.7", FrameworkDisplayName = ".NET Framework 4.7")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.3.7.0")] [module: UnverifiableCode] namespace Utf8Json { [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Interface, AllowMultiple = false, Inherited = true)] public class JsonFormatterAttribute : Attribute { public Type FormatterType { get; private set; } public object[] Arguments { get; private set; } public JsonFormatterAttribute(Type formatterType) { FormatterType = formatterType; } public JsonFormatterAttribute(Type formatterType, params object[] arguments) { FormatterType = formatterType; Arguments = arguments; } } [AttributeUsage(AttributeTargets.Constructor, AllowMultiple = false, Inherited = true)] public class SerializationConstructorAttribute : Attribute { } public delegate void JsonSerializeAction<T>(ref JsonWriter writer, T value, IJsonFormatterResolver resolver); public delegate T JsonDeserializeFunc<T>(ref JsonReader reader, IJsonFormatterResolver resolver); public interface IJsonFormatter { } public interface IJsonFormatter<T> : IJsonFormatter { void Serialize(ref JsonWriter writer, T value, IJsonFormatterResolver formatterResolver); T Deserialize(ref JsonReader reader, IJsonFormatterResolver formatterResolver); } public interface IObjectPropertyNameFormatter<T> { void SerializeToPropertyName(ref JsonWriter writer, T value, IJsonFormatterResolver formatterResolver); T DeserializeFromPropertyName(ref JsonReader reader, IJsonFormatterResolver formatterResolver); } public static class JsonFormatterExtensions { public static string ToJsonString<T>(this IJsonFormatter<T> formatter, T value, IJsonFormatterResolver formatterResolver) { JsonWriter writer = default(JsonWriter); formatter.Serialize(ref writer, value, formatterResolver); return writer.ToString(); } } public interface IJsonFormatterResolver { IJsonFormatter<T> GetFormatter<T>(); } public static class JsonFormatterResolverExtensions { public static IJsonFormatter<T> GetFormatterWithVerify<T>(this IJsonFormatterResolver resolver) { IJsonFormatter<T> formatter; try { formatter = resolver.GetFormatter<T>(); } catch (TypeInitializationException innerException) { while (innerException.InnerException != null) { innerException = (TypeInitializationException)innerException.InnerException; } throw innerException; } if (formatter == null) { throw new FormatterNotRegisteredException(typeof(T).FullName + " is not registered in this resolver. resolver:" + resolver.GetType().Name); } return formatter; } public static object GetFormatterDynamic(this IJsonFormatterResolver resolver, Type type) { return typeof(IJsonFormatterResolver).GetRuntimeMethod("GetFormatter", Type.EmptyTypes).MakeGenericMethod(type).Invoke(resolver, null); } } public class FormatterNotRegisteredException : Exception { public FormatterNotRegisteredException(string message) : base(message) { } } public struct JsonReader { internal static class StringBuilderCache { [ThreadStatic] private static byte[] buffer; [ThreadStatic] private static char[] codePointStringBuffer; public static byte[] GetBuffer() { if (buffer == null) { buffer = new byte[65535]; } return buffer; } public static char[] GetCodePointStringBuffer() { if (codePointStringBuffer == null) { codePointStringBuffer = new char[65535]; } return codePointStringBuffer; } } private static readonly ArraySegment<byte> nullTokenSegment = new ArraySegment<byte>(new byte[4] { 110, 117, 108, 108 }, 0, 4); private static readonly byte[] bom = Encoding.UTF8.GetPreamble(); private readonly byte[] bytes; private int offset; private bool IsInRange => offset < bytes.Length; public JsonReader(byte[] bytes) : this(bytes, 0) { } public JsonReader(byte[] bytes, int offset) { this.bytes = bytes; this.offset = offset; checked { if (bytes.Length >= 3 && bytes[offset] == bom[0] && bytes[offset + 1] == bom[1] && bytes[offset + 2] == bom[2]) { this.offset = (offset += 3); } } } private JsonParsingException CreateParsingException(string expected) { char c = (char)bytes[offset]; string text = c.ToString(); int num = offset; try { switch (GetCurrentJsonToken()) { case JsonToken.Number: { ArraySegment<byte> arraySegment = ReadNumberSegment(); text = StringEncoding.UTF8.GetString(arraySegment.Array, arraySegment.Offset, arraySegment.Count); break; } case JsonToken.String: text = "\"" + ReadString() + "\""; break; case JsonToken.True: text = "true"; break; case JsonToken.False: text = "false"; break; case JsonToken.Null: text = "null"; break; } } catch { } return new JsonParsingException("expected:'" + expected + "', actual:'" + text + "', at offset:" + num, bytes, num, offset, text); } private JsonParsingException CreateParsingExceptionMessage(string message) { char c = (char)bytes[offset]; string actualChar = c.ToString(); int limit = offset; return new JsonParsingException(message, bytes, limit, limit, actualChar); } public void AdvanceOffset(int offset) { checked { this.offset += offset; } } public byte[] GetBufferUnsafe() { return bytes; } public int GetCurrentOffsetUnsafe() { return offset; } public JsonToken GetCurrentJsonToken() { SkipWhiteSpace(); if (offset < bytes.Length) { return bytes[offset] switch { 123 => JsonToken.BeginObject, 125 => JsonToken.EndObject, 91 => JsonToken.BeginArray, 93 => JsonToken.EndArray, 116 => JsonToken.True, 102 => JsonToken.False, 110 => JsonToken.Null, 44 => JsonToken.ValueSeparator, 58 => JsonToken.NameSeparator, 45 => JsonToken.Number, 48 => JsonToken.Number, 49 => JsonToken.Number, 50 => JsonToken.Number, 51 => JsonToken.Number, 52 => JsonToken.Number, 53 => JsonToken.Number, 54 => JsonToken.Number, 55 => JsonToken.Number, 56 => JsonToken.Number, 57 => JsonToken.Number, 34 => JsonToken.String, _ => JsonToken.None, }; } return JsonToken.None; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void SkipWhiteSpace() { for (int i = offset; i < bytes.Length; i = checked(i + 1)) { switch (bytes[i]) { case 47: i = ReadComment(bytes, i); break; default: offset = i; return; case 9: case 10: case 13: case 32: break; } } offset = bytes.Length; } public bool ReadIsNull() { SkipWhiteSpace(); checked { if (IsInRange && bytes[offset] == 110) { if (bytes[offset + 1] == 117 && bytes[offset + 2] == 108 && bytes[offset + 3] == 108) { offset += 4; return true; } throw CreateParsingException("null"); } return false; } } public bool ReadIsBeginArray() { SkipWhiteSpace(); checked { if (IsInRange && bytes[offset] == 91) { offset++; return true; } return false; } } public void ReadIsBeginArrayWithVerify() { if (!ReadIsBeginArray()) { throw CreateParsingException("["); } } public bool ReadIsEndArray() { SkipWhiteSpace(); checked { if (IsInRange && bytes[offset] == 93) { offset++; return true; } return false; } } public void ReadIsEndArrayWithVerify() { if (!ReadIsEndArray()) { throw CreateParsingException("]"); } } public bool ReadIsEndArrayWithSkipValueSeparator(ref int count) { SkipWhiteSpace(); checked { if (IsInRange && bytes[offset] == 93) { offset++; return true; } if (count++ != 0) { ReadIsValueSeparatorWithVerify(); } return false; } } public bool ReadIsInArray(ref int count) { if (count == 0) { ReadIsBeginArrayWithVerify(); if (ReadIsEndArray()) { return false; } } else { if (ReadIsEndArray()) { return false; } ReadIsValueSeparatorWithVerify(); } checked { count++; return true; } } public bool ReadIsBeginObject() { SkipWhiteSpace(); checked { if (IsInRange && bytes[offset] == 123) { offset++; return true; } return false; } } public void ReadIsBeginObjectWithVerify() { if (!ReadIsBeginObject()) { throw CreateParsingException("{"); } } public bool ReadIsEndObject() { SkipWhiteSpace(); checked { if (IsInRange && bytes[offset] == 125) { offset++; return true; } return false; } } public void ReadIsEndObjectWithVerify() { if (!ReadIsEndObject()) { throw CreateParsingException("}"); } } public bool ReadIsEndObjectWithSkipValueSeparator(ref int count) { SkipWhiteSpace(); checked { if (IsInRange && bytes[offset] == 125) { offset++; return true; } if (count++ != 0) { ReadIsValueSeparatorWithVerify(); } return false; } } public bool ReadIsInObject(ref int count) { if (count == 0) { ReadIsBeginObjectWithVerify(); if (ReadIsEndObject()) { return false; } } else { if (ReadIsEndObject()) { return false; } ReadIsValueSeparatorWithVerify(); } checked { count++; return true; } } public bool ReadIsValueSeparator() { SkipWhiteSpace(); checked { if (IsInRange && bytes[offset] == 44) { offset++; return true; } return false; } } public void ReadIsValueSeparatorWithVerify() { if (!ReadIsValueSeparator()) { throw CreateParsingException(","); } } public bool ReadIsNameSeparator() { SkipWhiteSpace(); checked { if (IsInRange && bytes[offset] == 58) { offset++; return true; } return false; } } public void ReadIsNameSeparatorWithVerify() { if (!ReadIsNameSeparator()) { throw CreateParsingException(":"); } } private void ReadStringSegmentCore(out byte[] resultBytes, out int resultOffset, out int resultLength) { byte[] array = null; int num = 0; char[] array2 = null; int num2 = 0; if (bytes[offset] != 34) { throw CreateParsingException("String Begin Token"); } checked { offset++; int num3 = offset; for (int i = offset; i < bytes.Length; i++) { byte b = 0; switch (bytes[i]) { case 92: { switch (unchecked((char)bytes[checked(i + 1)])) { case '"': case '/': case '\\': b = bytes[i + 1]; break; case 'b': b = 8; break; case 'f': b = 12; break; case 'n': b = 10; break; case 'r': b = 13; break; case 't': b = 9; break; case 'u': { if (array2 == null) { array2 = StringBuilderCache.GetCodePointStringBuffer(); } if (num2 == 0) { if (array == null) { array = StringBuilderCache.GetBuffer(); } int num5 = i - num3; BinaryUtil.EnsureCapacity(ref array, num, num5 + 1); Buffer.BlockCopy(bytes, num3, array, num, num5); num += num5; } if (array2.Length == num2) { Array.Resize(ref array2, array2.Length * 2); } byte a = bytes[i + 2]; unchecked { char b2 = (char)bytes[checked(i + 3)]; char c = (char)bytes[checked(i + 4)]; char d = (char)bytes[checked(i + 5)]; int codePoint = GetCodePoint((char)a, b2, c, d); array2[checked(num2++)] = (char)checked((ushort)codePoint); } i += 5; offset += 6; num3 = offset; continue; } default: throw CreateParsingExceptionMessage("Bad JSON escape."); } if (array == null) { array = StringBuilderCache.GetBuffer(); } if (num2 != 0) { BinaryUtil.EnsureCapacity(ref array, num, StringEncoding.UTF8.GetMaxByteCount(num2)); num += StringEncoding.UTF8.GetBytes(array2, 0, num2, array, num); num2 = 0; } int num6 = i - num3; BinaryUtil.EnsureCapacity(ref array, num, num6 + 1); Buffer.BlockCopy(bytes, num3, array, num, num6); num += num6; array[num++] = b; i++; offset += 2; num3 = offset; continue; } case 34: { offset++; if (num == 0 && num2 == 0) { resultBytes = bytes; resultOffset = num3; resultLength = offset - 1 - num3; return; } if (array == null) { array = StringBuilderCache.GetBuffer(); } if (num2 != 0) { BinaryUtil.EnsureCapacity(ref array, num, StringEncoding.UTF8.GetMaxByteCount(num2)); num += StringEncoding.UTF8.GetBytes(array2, 0, num2, array, num); num2 = 0; } int num4 = offset - num3 - 1; BinaryUtil.EnsureCapacity(ref array, num, num4); Buffer.BlockCopy(bytes, num3, array, num, num4); num += num4; resultBytes = array; resultOffset = 0; resultLength = num; return; } } if (num2 != 0) { if (array == null) { array = StringBuilderCache.GetBuffer(); } BinaryUtil.EnsureCapacity(ref array, num, StringEncoding.UTF8.GetMaxByteCount(num2)); num += StringEncoding.UTF8.GetBytes(array2, 0, num2, array, num); num2 = 0; } offset++; } resultLength = 0; resultBytes = null; resultOffset = 0; throw CreateParsingException("String End Token"); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static int GetCodePoint(char a, char b, char c, char d) { return checked(((ToNumber(a) * 16 + ToNumber(b)) * 16 + ToNumber(c)) * 16 + ToNumber(d)); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static int ToNumber(char x) { checked { if ('0' <= x && x <= '9') { return x - 48; } if ('a' <= x && x <= 'f') { return x - 97 + 10; } if ('A' <= x && x <= 'F') { return x - 65 + 10; } throw new JsonParsingException("Invalid Character" + x); } } public ArraySegment<byte> ReadStringSegmentUnsafe() { if (ReadIsNull()) { return nullTokenSegment; } ReadStringSegmentCore(out var resultBytes, out var resultOffset, out var resultLength); return new ArraySegment<byte>(resultBytes, resultOffset, resultLength); } public string ReadString() { if (ReadIsNull()) { return null; } ReadStringSegmentCore(out var resultBytes, out var resultOffset, out var resultLength); return Encoding.UTF8.GetString(resultBytes, resultOffset, resultLength); } public string ReadPropertyName() { string result = ReadString(); ReadIsNameSeparatorWithVerify(); return result; } public ArraySegment<byte> ReadStringSegmentRaw() { ArraySegment<byte> arraySegment = default(ArraySegment<byte>); if (ReadIsNull()) { return nullTokenSegment; } checked { if (bytes[offset++] != 34) { throw CreateParsingException("\""); } int num = offset; for (int i = offset; i < bytes.Length; i++) { if (bytes[i] == 34 && bytes[i - 1] != 92) { offset = i + 1; return new ArraySegment<byte>(bytes, num, offset - num - 1); } } throw CreateParsingExceptionMessage("not found end string."); } } public ArraySegment<byte> ReadPropertyNameSegmentRaw() { ArraySegment<byte> result = ReadStringSegmentRaw(); ReadIsNameSeparatorWithVerify(); return result; } public bool ReadBoolean() { SkipWhiteSpace(); checked { if (bytes[offset] == 116) { if (bytes[offset + 1] == 114 && bytes[offset + 2] == 117 && bytes[offset + 3] == 101) { offset += 4; return true; } throw CreateParsingException("true"); } if (bytes[offset] == 102) { if (bytes[offset + 1] == 97 && bytes[offset + 2] == 108 && bytes[offset + 3] == 115 && bytes[offset + 4] == 101) { offset += 5; return false; } throw CreateParsingException("false"); } throw CreateParsingException("true | false"); } } private static bool IsWordBreak(byte c) { switch (c) { case 32: case 34: case 44: case 58: case 91: case 93: case 123: case 125: return true; default: return false; } } public void ReadNext() { JsonToken currentJsonToken = GetCurrentJsonToken(); ReadNextCore(currentJsonToken); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private void ReadNextCore(JsonToken token) { checked { switch (token) { case JsonToken.BeginObject: case JsonToken.EndObject: case JsonToken.BeginArray: case JsonToken.EndArray: case JsonToken.ValueSeparator: case JsonToken.NameSeparator: offset++; break; case JsonToken.True: case JsonToken.Null: offset += 4; break; case JsonToken.False: offset += 5; break; case JsonToken.String: { offset++; for (int j = offset; j < bytes.Length; j++) { if (bytes[j] == 34 && bytes[j - 1] != 92) { offset = j + 1; return; } } throw CreateParsingExceptionMessage("not found end string."); } case JsonToken.Number: { for (int i = offset; i < bytes.Length; i++) { if (IsWordBreak(bytes[i])) { offset = i; return; } } offset = bytes.Length; break; } case JsonToken.None: break; } } } public void ReadNextBlock() { ReadNextBlockCore(0); } private void ReadNextBlockCore(int stack) { JsonToken currentJsonToken = GetCurrentJsonToken(); checked { switch (currentJsonToken) { default: return; case JsonToken.BeginObject: case JsonToken.BeginArray: offset++; ReadNextBlockCore(stack + 1); return; case JsonToken.EndObject: case JsonToken.EndArray: offset++; if (stack - 1 != 0) { ReadNextBlockCore(stack - 1); } return; case JsonToken.Number: case JsonToken.String: case JsonToken.True: case JsonToken.False: case JsonToken.Null: case JsonToken.ValueSeparator: case JsonToken.NameSeparator: break; case JsonToken.None: return; } } do { ReadNextCore(currentJsonToken); currentJsonToken = GetCurrentJsonToken(); } while (stack != 0 && (int)currentJsonToken >= 5); if (stack != 0) { ReadNextBlockCore(stack); } } public ArraySegment<byte> ReadNextBlockSegment() { int num = offset; ReadNextBlock(); return new ArraySegment<byte>(bytes, num, checked(offset - num)); } public sbyte ReadSByte() { return checked((sbyte)ReadInt64()); } public short ReadInt16() { return checked((short)ReadInt64()); } public int ReadInt32() { return checked((int)ReadInt64()); } public long ReadInt64() { SkipWhiteSpace(); int readCount; long result = NumberConverter.ReadInt64(bytes, offset, out readCount); if (readCount == 0) { throw CreateParsingException("Number Token"); } checked { offset += readCount; return result; } } public byte ReadByte() { return checked((byte)ReadUInt64()); } public ushort ReadUInt16() { return checked((ushort)ReadUInt64()); } public uint ReadUInt32() { return checked((uint)ReadUInt64()); } public ulong ReadUInt64() { SkipWhiteSpace(); int readCount; ulong result = NumberConverter.ReadUInt64(bytes, offset, out readCount); if (readCount == 0) { throw CreateParsingException("Number Token"); } checked { offset += readCount; return result; } } public float ReadSingle() { SkipWhiteSpace(); int readCount; float result = StringToDoubleConverter.ToSingle(bytes, offset, out readCount); if (readCount == 0) { throw CreateParsingException("Number Token"); } checked { offset += readCount; return result; } } public double ReadDouble() { SkipWhiteSpace(); int readCount; double result = StringToDoubleConverter.ToDouble(bytes, offset, out readCount); if (readCount == 0) { throw CreateParsingException("Number Token"); } checked { offset += readCount; return result; } } public ArraySegment<byte> ReadNumberSegment() { SkipWhiteSpace(); int num = offset; int num2 = offset; checked { while (true) { if (num2 < bytes.Length) { if (!NumberConverter.IsNumberRepresentation(bytes[num2])) { offset = num2; break; } num2++; continue; } offset = bytes.Length; break; } return new ArraySegment<byte>(bytes, num, offset - num); } } private static int ReadComment(byte[] bytes, int offset) { checked { if (bytes[offset + 1] == 47) { offset += 2; for (int i = offset; i < bytes.Length; i++) { if (bytes[i] == 13 || bytes[i] == 10) { return i; } } throw new JsonParsingException("Can not find end token of single line comment(\r or \n)."); } if (bytes[offset + 1] == 42) { offset += 2; for (int j = offset; j < bytes.Length; j++) { if (bytes[j] == 42 && bytes[j + 1] == 47) { return j + 1; } } throw new JsonParsingException("Can not find end token of multi line comment(*/)."); } return offset; } } } public class JsonParsingException : Exception { private WeakReference underyingBytes; private int limit; public int Offset { get; private set; } public string ActualChar { get; set; } public JsonParsingException(string message) : base(message) { } public JsonParsingException(string message, byte[] underlyingBytes, int offset, int limit, string actualChar) : base(message) { underyingBytes = new WeakReference(underlyingBytes); Offset = offset; ActualChar = actualChar; this.limit = limit; } public byte[] GetUnderlyingByteArrayUnsafe() { return underyingBytes.Target as byte[]; } public string GetUnderlyingStringUnsafe() { if (underyingBytes.Target is byte[] bytes) { return StringEncoding.UTF8.GetString(bytes, 0, limit) + "..."; } return null; } } public static class JsonSerializer { private static class MemoryPool { [ThreadStatic] private static byte[] buffer; public static byte[] GetBuffer() { if (buffer == null) { buffer = new byte[65536]; } return buffer; } } public static class NonGeneric { private delegate void SerializeJsonWriter(ref JsonWriter writer, object value, IJsonFormatterResolver resolver); private delegate object DeserializeJsonReader(ref JsonReader reader, IJsonFormatterResolver resolver); private class CompiledMethods { public readonly Func<object, IJsonFormatterResolver, byte[]> serialize1; public readonly Action<Stream, object, IJsonFormatterResolver> serialize2; public readonly SerializeJsonWriter serialize3; public readonly Func<object, IJsonFormatterResolver, ArraySegment<byte>> serializeUnsafe; public readonly Func<object, IJsonFormatterResolver, string> toJsonString; public readonly Func<string, IJsonFormatterResolver, object> deserialize1; public readonly Func<byte[], int, IJsonFormatterResolver, object> deserialize2; public readonly Func<Stream, IJsonFormatterResolver, object> deserialize3; public readonly DeserializeJsonReader deserialize4; public readonly Func<Stream, object, IJsonFormatterResolver, Task> serializeAsync; public readonly Func<Stream, IJsonFormatterResolver, Task<object>> deserializeAsync; public CompiledMethods(Type type) { DynamicMethod dynamicMethod = new DynamicMethod("serialize1", typeof(byte[]), new Type[2] { typeof(object), typeof(IJsonFormatterResolver) }, type.Module, skipVisibility: true); ILGenerator iLGenerator = dynamicMethod.GetILGenerator(); iLGenerator.EmitLdarg(0); iLGenerator.EmitUnboxOrCast(type); iLGenerator.EmitLdarg(1); iLGenerator.EmitCall(GetMethod(type, "Serialize", new Type[2] { null, typeof(IJsonFormatterResolver) })); iLGenerator.Emit(OpCodes.Ret); serialize1 = CreateDelegate<Func<object, IJsonFormatterResolver, byte[]>>(dynamicMethod); DynamicMethod dynamicMethod2 = new DynamicMethod("serialize2", null, new Type[3] { typeof(Stream), typeof(object), typeof(IJsonFormatterResolver) }, type.Module, skipVisibility: true); ILGenerator iLGenerator2 = dynamicMethod2.GetILGenerator(); iLGenerator2.EmitLdarg(0); iLGenerator2.EmitLdarg(1); iLGenerator2.EmitUnboxOrCast(type); iLGenerator2.EmitLdarg(2); iLGenerator2.EmitCall(GetMethod(type, "Serialize", new Type[3] { typeof(Stream), null, typeof(IJsonFormatterResolver) })); iLGenerator2.Emit(OpCodes.Ret); serialize2 = CreateDelegate<Action<Stream, object, IJsonFormatterResolver>>(dynamicMethod2); DynamicMethod dynamicMethod3 = new DynamicMethod("serialize3", null, new Type[3] { typeof(JsonWriter).MakeByRefType(), typeof(object), typeof(IJsonFormatterResolver) }, type.Module, skipVisibility: true); ILGenerator iLGenerator3 = dynamicMethod3.GetILGenerator(); iLGenerator3.EmitLdarg(0); iLGenerator3.EmitLdarg(1); iLGenerator3.EmitUnboxOrCast(type); iLGenerator3.EmitLdarg(2); iLGenerator3.EmitCall(GetMethod(type, "Serialize", new Type[3] { typeof(JsonWriter).MakeByRefType(), null, typeof(IJsonFormatterResolver) })); iLGenerator3.Emit(OpCodes.Ret); serialize3 = CreateDelegate<SerializeJsonWriter>(dynamicMethod3); DynamicMethod dynamicMethod4 = new DynamicMethod("serializeUnsafe", typeof(ArraySegment<byte>), new Type[2] { typeof(object), typeof(IJsonFormatterResolver) }, type.Module, skipVisibility: true); ILGenerator iLGenerator4 = dynamicMethod4.GetILGenerator(); iLGenerator4.EmitLdarg(0); iLGenerator4.EmitUnboxOrCast(type); iLGenerator4.EmitLdarg(1); iLGenerator4.EmitCall(GetMethod(type, "SerializeUnsafe", new Type[2] { null, typeof(IJsonFormatterResolver) })); iLGenerator4.Emit(OpCodes.Ret); serializeUnsafe = CreateDelegate<Func<object, IJsonFormatterResolver, ArraySegment<byte>>>(dynamicMethod4); DynamicMethod dynamicMethod5 = new DynamicMethod("toJsonString", typeof(string), new Type[2] { typeof(object), typeof(IJsonFormatterResolver) }, type.Module, skipVisibility: true); ILGenerator iLGenerator5 = dynamicMethod5.GetILGenerator(); iLGenerator5.EmitLdarg(0); iLGenerator5.EmitUnboxOrCast(type); iLGenerator5.EmitLdarg(1); iLGenerator5.EmitCall(GetMethod(type, "ToJsonString", new Type[2] { null, typeof(IJsonFormatterResolver) })); iLGenerator5.Emit(OpCodes.Ret); toJsonString = CreateDelegate<Func<object, IJsonFormatterResolver, string>>(dynamicMethod5); DynamicMethod dynamicMethod6 = new DynamicMethod("Deserialize", typeof(object), new Type[2] { typeof(string), typeof(IJsonFormatterResolver) }, type.Module, skipVisibility: true); ILGenerator iLGenerator6 = dynamicMethod6.GetILGenerator(); iLGenerator6.EmitLdarg(0); iLGenerator6.EmitLdarg(1); iLGenerator6.EmitCall(GetMethod(type, "Deserialize", new Type[2] { typeof(string), typeof(IJsonFormatterResolver) })); iLGenerator6.EmitBoxOrDoNothing(type); iLGenerator6.Emit(OpCodes.Ret); deserialize1 = CreateDelegate<Func<string, IJsonFormatterResolver, object>>(dynamicMethod6); DynamicMethod dynamicMethod7 = new DynamicMethod("Deserialize", typeof(object), new Type[3] { typeof(byte[]), typeof(int), typeof(IJsonFormatterResolver) }, type.Module, skipVisibility: true); ILGenerator iLGenerator7 = dynamicMethod7.GetILGenerator(); iLGenerator7.EmitLdarg(0); iLGenerator7.EmitLdarg(1); iLGenerator7.EmitLdarg(2); iLGenerator7.EmitCall(GetMethod(type, "Deserialize", new Type[3] { typeof(byte[]), typeof(int), typeof(IJsonFormatterResolver) })); iLGenerator7.EmitBoxOrDoNothing(type); iLGenerator7.Emit(OpCodes.Ret); deserialize2 = CreateDelegate<Func<byte[], int, IJsonFormatterResolver, object>>(dynamicMethod7); DynamicMethod dynamicMethod8 = new DynamicMethod("Deserialize", typeof(object), new Type[2] { typeof(Stream), typeof(IJsonFormatterResolver) }, type.Module, skipVisibility: true); ILGenerator iLGenerator8 = dynamicMethod8.GetILGenerator(); iLGenerator8.EmitLdarg(0); iLGenerator8.EmitLdarg(1); iLGenerator8.EmitCall(GetMethod(type, "Deserialize", new Type[2] { typeof(Stream), typeof(IJsonFormatterResolver) })); iLGenerator8.EmitBoxOrDoNothing(type); iLGenerator8.Emit(OpCodes.Ret); deserialize3 = CreateDelegate<Func<Stream, IJsonFormatterResolver, object>>(dynamicMethod8); DynamicMethod dynamicMethod9 = new DynamicMethod("Deserialize", typeof(object), new Type[2] { typeof(JsonReader).MakeByRefType(), typeof(IJsonFormatterResolver) }, type.Module, skipVisibility: true); ILGenerator iLGenerator9 = dynamicMethod9.GetILGenerator(); iLGenerator9.EmitLdarg(0); iLGenerator9.EmitLdarg(1); iLGenerator9.EmitCall(GetMethod(type, "Deserialize", new Type[2] { typeof(JsonReader).MakeByRefType(), typeof(IJsonFormatterResolver) })); iLGenerator9.EmitBoxOrDoNothing(type); iLGenerator9.Emit(OpCodes.Ret); deserialize4 = CreateDelegate<DeserializeJsonReader>(dynamicMethod9); DynamicMethod dynamicMethod10 = new DynamicMethod("SerializeAsync", typeof(Task), new Type[3] { typeof(Stream), typeof(object), typeof(IJsonFormatterResolver) }, type.Module, skipVisibility: true); ILGenerator iLGenerator10 = dynamicMethod10.GetILGenerator(); iLGenerator10.EmitLdarg(0); iLGenerator10.EmitLdarg(1); iLGenerator10.EmitUnboxOrCast(type); iLGenerator10.EmitLdarg(2); iLGenerator10.EmitCall(GetMethod(type, "SerializeAsync", new Type[3] { typeof(Stream), null, typeof(IJsonFormatterResolver) })); iLGenerator10.Emit(OpCodes.Ret); serializeAsync = CreateDelegate<Func<Stream, object, IJsonFormatterResolver, Task>>(dynamicMethod10); DynamicMethod dynamicMethod11 = new DynamicMethod("DeserializeAsync", typeof(Task<object>), new Type[2] { typeof(Stream), typeof(IJsonFormatterResolver) }, type.Module, skipVisibility: true); ILGenerator iLGenerator11 = dynamicMethod11.GetILGenerator(); iLGenerator11.EmitLdarg(0); iLGenerator11.EmitLdarg(1); iLGenerator11.EmitCall(GetMethod(type, "DeserializeAsync", new Type[2] { typeof(Stream), typeof(IJsonFormatterResolver) })); iLGenerator11.EmitCall(typeof(CompiledMethods).GetMethod("TaskCast", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic).MakeGenericMethod(type)); iLGenerator11.Emit(OpCodes.Ret); deserializeAsync = CreateDelegate<Func<Stream, IJsonFormatterResolver, Task<object>>>(dynamicMethod11); } private static async Task<object> TaskCast<T>(Task<T> task) { return await task.ConfigureAwait(continueOnCapturedContext: false); } private static T CreateDelegate<T>(DynamicMethod dm) { return (T)(object)dm.CreateDelegate(typeof(T)); } private static MethodInfo GetMethod(Type type, string name, Type[] arguments) { return (from x in typeof(JsonSerializer).GetMethods(BindingFlags.Static | BindingFlags.Public) where x.Name == name select x).Single(delegate(MethodInfo x) { ParameterInfo[] parameters = x.GetParameters(); if (parameters.Length != arguments.Length) { return false; } for (int i = 0; i < parameters.Length; i = checked(i + 1)) { if ((!(arguments[i] == null) || !parameters[i].ParameterType.IsGenericParameter) && parameters[i].ParameterType != arguments[i]) { return false; } } return true; }).MakeGenericMethod(type); } } private static readonly Func<Type, CompiledMethods> CreateCompiledMethods; private static readonly ThreadsafeTypeKeyHashTable<CompiledMethods> serializes; static NonGeneric() { serializes = new ThreadsafeTypeKeyHashTable<CompiledMethods>(64); CreateCompiledMethods = (Type t) => new CompiledMethods(t); } private static CompiledMethods GetOrAdd(Type type) { return serializes.GetOrAdd(type, CreateCompiledMethods); } public static byte[] Serialize(object value) { if (value == null) { return JsonSerializer.Serialize(value); } return Serialize(value.GetType(), value, defaultResolver); } public static byte[] Serialize(Type type, object value) { return Serialize(type, value, defaultResolver); } public static byte[] Serialize(object value, IJsonFormatterResolver resolver) { if (value == null) { return JsonSerializer.Serialize(value, resolver); } return Serialize(value.GetType(), value, resolver); } public static byte[] Serialize(Type type, object value, IJsonFormatterResolver resolver) { return GetOrAdd(type).serialize1(value, resolver); } public static void Serialize(Stream stream, object value) { if (value == null) { JsonSerializer.Serialize(stream, value); } else { Serialize(value.GetType(), stream, value, defaultResolver); } } public static void Serialize(Type type, Stream stream, object value) { Serialize(type, stream, value, defaultResolver); } public static void Serialize(Stream stream, object value, IJsonFormatterResolver resolver) { if (value == null) { JsonSerializer.Serialize(stream, value, resolver); } else { Serialize(value.GetType(), stream, value, resolver); } } public static void Serialize(Type type, Stream stream, object value, IJsonFormatterResolver resolver) { GetOrAdd(type).serialize2(stream, value, resolver); } public static Task SerializeAsync(Stream stream, object value) { if (value == null) { return JsonSerializer.SerializeAsync(stream, value); } return SerializeAsync(value.GetType(), stream, value, defaultResolver); } public static Task SerializeAsync(Type type, Stream stream, object value) { return SerializeAsync(type, stream, value, defaultResolver); } public static Task SerializeAsync(Stream stream, object value, IJsonFormatterResolver resolver) { if (value == null) { return JsonSerializer.SerializeAsync(stream, value, resolver); } return SerializeAsync(value.GetType(), stream, value, resolver); } public static Task SerializeAsync(Type type, Stream stream, object value, IJsonFormatterResolver resolver) { return GetOrAdd(type).serializeAsync(stream, value, resolver); } public static void Serialize(ref JsonWriter writer, object value, IJsonFormatterResolver resolver) { if (value == null) { writer.WriteNull(); } else { Serialize(value.GetType(), ref writer, value, resolver); } } public static void Serialize(Type type, ref JsonWriter writer, object value) { Serialize(type, ref writer, value, defaultResolver); } public static void Serialize(Type type, ref JsonWriter writer, object value, IJsonFormatterResolver resolver) { GetOrAdd(type).serialize3(ref writer, value, resolver); } public static ArraySegment<byte> SerializeUnsafe(object value) { if (value == null) { return JsonSerializer.SerializeUnsafe(value); } return SerializeUnsafe(value.GetType(), value); } public static ArraySegment<byte> SerializeUnsafe(Type type, object value) { return SerializeUnsafe(type, value, defaultResolver); } public static ArraySegment<byte> SerializeUnsafe(object value, IJsonFormatterResolver resolver) { if (value == null) { return JsonSerializer.SerializeUnsafe(value); } return SerializeUnsafe(value.GetType(), value, resolver); } public static ArraySegment<byte> SerializeUnsafe(Type type, object value, IJsonFormatterResolver resolver) { return GetOrAdd(type).serializeUnsafe(value, resolver); } public static string ToJsonString(object value) { if (value == null) { return "null"; } return ToJsonString(value.GetType(), value); } public static string ToJsonString(Type type, object value) { return ToJsonString(type, value, defaultResolver); } public static string ToJsonString(object value, IJsonFormatterResolver resolver) { if (value == null) { return "null"; } return ToJsonString(value.GetType(), value, resolver); } public static string ToJsonString(Type type, object value, IJsonFormatterResolver resolver) { return GetOrAdd(type).toJsonString(value, resolver); } public static object Deserialize(Type type, string json) { return Deserialize(type, json, defaultResolver); } public static object Deserialize(Type type, string json, IJsonFormatterResolver resolver) { return GetOrAdd(type).deserialize1(json, resolver); } public static object Deserialize(Type type, byte[] bytes) { return Deserialize(type, bytes, defaultResolver); } public static object Deserialize(Type type, byte[] bytes, IJsonFormatterResolver resolver) { return Deserialize(type, bytes, 0, defaultResolver); } public static object Deserialize(Type type, byte[] bytes, int offset) { return Deserialize(type, bytes, offset, defaultResolver); } public static object Deserialize(Type type, byte[] bytes, int offset, IJsonFormatterResolver resolver) { return GetOrAdd(type).deserialize2(bytes, offset, resolver); } public static object Deserialize(Type type, Stream stream) { return Deserialize(type, stream, defaultResolver); } public static object Deserialize(Type type, Stream stream, IJsonFormatterResolver resolver) { return GetOrAdd(type).deserialize3(stream, resolver); } public static object Deserialize(Type type, ref JsonReader reader) { return Deserialize(type, ref reader, defaultResolver); } public static object Deserialize(Type type, ref JsonReader reader, IJsonFormatterResolver resolver) { return GetOrAdd(type).deserialize4(ref reader, resolver); } public static Task<object> DeserializeAsync(Type type, Stream stream) { return DeserializeAsync(type, stream, defaultResolver); } public static Task<object> DeserializeAsync(Type type, Stream stream, IJsonFormatterResolver resolver) { return GetOrAdd(type).deserializeAsync(stream, resolver); } } private static IJsonFormatterResolver defaultResolver; private static readonly byte[][] indent = (from x in Enumerable.Range(0, 100) select Encoding.UTF8.GetBytes(new string(' ', checked(x * 2)))).ToArray(); private static readonly byte[] newLine = Encoding.UTF8.GetBytes(Environment.NewLine); public static IJsonFormatterResolver DefaultResolver { get { if (defaultResolver == null) { defaultResolver = StandardResolver.Default; } return defaultResolver; } } public static bool IsInitialized => defaultResolver != null; public static void SetDefaultResolver(IJsonFormatterResolver resolver) { defaultResolver = resolver; } public static byte[] Serialize<T>(T obj) { return Serialize(obj, defaultResolver); } public static byte[] Serialize<T>(T value, IJsonFormatterResolver resolver) { if (resolver == null) { resolver = DefaultResolver; } JsonWriter writer = new JsonWriter(MemoryPool.GetBuffer()); resolver.GetFormatterWithVerify<T>().Serialize(ref writer, value, resolver); return writer.ToUtf8ByteArray(); } public static void Serialize<T>(ref JsonWriter writer, T value) { Serialize(ref writer, value, defaultResolver); } public static void Serialize<T>(ref JsonWriter writer, T value, IJsonFormatterResolver resolver) { if (resolver == null) { resolver = DefaultResolver; } resolver.GetFormatterWithVerify<T>().Serialize(ref writer, value, resolver); } public static void Serialize<T>(Stream stream, T value) { Serialize(stream, value, defaultResolver); } public static void Serialize<T>(Stream stream, T value, IJsonFormatterResolver resolver) { if (resolver == null) { resolver = DefaultResolver; } ArraySegment<byte> arraySegment = SerializeUnsafe(value, resolver); stream.Write(arraySegment.Array, arraySegment.Offset, arraySegment.Count); } public static Task SerializeAsync<T>(Stream stream, T value) { return SerializeAsync(stream, value, defaultResolver); } public static async Task SerializeAsync<T>(Stream stream, T value, IJsonFormatterResolver resolver) { if (resolver == null) { resolver = DefaultResolver; } byte[] buf = BufferPool.Default.Rent(); try { JsonWriter writer = new JsonWriter(buf); resolver.GetFormatterWithVerify<T>().Serialize(ref writer, value, resolver); ArraySegment<byte> buffer = writer.GetBuffer(); await stream.WriteAsync(buffer.Array, buffer.Offset, buffer.Count).ConfigureAwait(continueOnCapturedContext: false); } finally { BufferPool.Default.Return(buf); } } public static ArraySegment<byte> SerializeUnsafe<T>(T obj) { return SerializeUnsafe(obj, defaultResolver); } public static ArraySegment<byte> SerializeUnsafe<T>(T value, IJsonFormatterResolver resolver) { if (resolver == null) { resolver = DefaultResolver; } JsonWriter writer = new JsonWriter(MemoryPool.GetBuffer()); resolver.GetFormatterWithVerify<T>().Serialize(ref writer, value, resolver); return writer.GetBuffer(); } public static string ToJsonString<T>(T value) { return ToJsonString(value, defaultResolver); } public static string ToJsonString<T>(T value, IJsonFormatterResolver resolver) { if (resolver == null) { resolver = DefaultResolver; } JsonWriter writer = new JsonWriter(MemoryPool.GetBuffer()); resolver.GetFormatterWithVerify<T>().Serialize(ref writer, value, resolver); return writer.ToString(); } public static T Deserialize<T>(string json) { return Deserialize<T>(json, defaultResolver); } public static T Deserialize<T>(string json, IJsonFormatterResolver resolver) { return Deserialize<T>(StringEncoding.UTF8.GetBytes(json), resolver); } public static T Deserialize<T>(byte[] bytes) { return Deserialize<T>(bytes, defaultResolver); } public static T Deserialize<T>(byte[] bytes, IJsonFormatterResolver resolver) { return Deserialize<T>(bytes, 0, resolver); } public static T Deserialize<T>(byte[] bytes, int offset) { return Deserialize<T>(bytes, offset, defaultResolver); } public static T Deserialize<T>(byte[] bytes, int offset, IJsonFormatterResolver resolver) { if (resolver == null) { resolver = DefaultResolver; } JsonReader reader = new JsonReader(bytes, offset); return resolver.GetFormatterWithVerify<T>().Deserialize(ref reader, resolver); } public static T Deserialize<T>(ref JsonReader reader) { return Deserialize<T>(ref reader, defaultResolver); } public static T Deserialize<T>(ref JsonReader reader, IJsonFormatterResolver resolver) { if (resolver == null) { resolver = DefaultResolver; } return resolver.GetFormatterWithVerify<T>().Deserialize(ref reader, resolver); } public static T Deserialize<T>(Stream stream) { return Deserialize<T>(stream, defaultResolver); } public static T Deserialize<T>(Stream stream, IJsonFormatterResolver resolver) { if (resolver == null) { resolver = DefaultResolver; } if (stream is MemoryStream memoryStream && memoryStream.TryGetBuffer(out var buffer)) { if (new JsonReader(buffer.Array, buffer.Offset).GetCurrentJsonToken() == JsonToken.Number) { byte[] array = new byte[buffer.Count]; Buffer.BlockCopy(buffer.Array, buffer.Offset, array, 0, array.Length); return Deserialize<T>(array, 0, resolver); } return Deserialize<T>(buffer.Array, buffer.Offset, resolver); } byte[] buffer2 = MemoryPool.GetBuffer(); int newSize = FillFromStream(stream, ref buffer2); if (new JsonReader(buffer2).GetCurrentJsonToken() == JsonToken.Number) { buffer2 = BinaryUtil.FastCloneWithResize(buffer2, newSize); } return Deserialize<T>(buffer2, resolver); } public static Task<T> DeserializeAsync<T>(Stream stream) { return DeserializeAsync<T>(stream, defaultResolver); } public static async Task<T> DeserializeAsync<T>(Stream stream, IJsonFormatterResolver resolver) { if (resolver == null) { resolver = DefaultResolver; } byte[] buffer = BufferPool.Default.Rent(); byte[] buf = buffer; checked { try { int length = 0; while (true) { int num; int read = (num = await stream.ReadAsync(buf, length, buf.Length - length).ConfigureAwait(continueOnCapturedContext: false)); if (num <= 0) { break; } length += read; if (length == buf.Length) { BinaryUtil.FastResize(ref buf, length * 2); } } if (new JsonReader(buf).GetCurrentJsonToken() == JsonToken.Number) { buf = BinaryUtil.FastCloneWithResize(buf, length); } return Deserialize<T>(buf, resolver); } finally { BufferPool.Default.Return(buffer); } } } public static string PrettyPrint(byte[] json) { return PrettyPrint(json, 0); } public static string PrettyPrint(byte[] json, int offset) { JsonReader reader = new JsonReader(json, offset); JsonWriter writer = new JsonWriter(MemoryPool.GetBuffer()); WritePrittyPrint(ref reader, ref writer, 0); return writer.ToString(); } public static string PrettyPrint(string json) { JsonReader reader = new JsonReader(Encoding.UTF8.GetBytes(json)); JsonWriter writer = new JsonWriter(MemoryPool.GetBuffer()); WritePrittyPrint(ref reader, ref writer, 0); return writer.ToString(); } public static byte[] PrettyPrintByteArray(byte[] json) { return PrettyPrintByteArray(json, 0); } public static byte[] PrettyPrintByteArray(byte[] json, int offset) { JsonReader reader = new JsonReader(json, offset); JsonWriter writer = new JsonWriter(MemoryPool.GetBuffer()); WritePrittyPrint(ref reader, ref writer, 0); return writer.ToUtf8ByteArray(); } public static byte[] PrettyPrintByteArray(string json) { JsonReader reader = new JsonReader(Encoding.UTF8.GetBytes(json)); JsonWriter writer = new JsonWriter(MemoryPool.GetBuffer()); WritePrittyPrint(ref reader, ref writer, 0); return writer.ToUtf8ByteArray(); } private static void WritePrittyPrint(ref JsonReader reader, ref JsonWriter writer, int depth) { checked { switch (reader.GetCurrentJsonToken()) { case JsonToken.BeginObject: { writer.WriteBeginObject(); writer.WriteRaw(newLine); int count2 = 0; while (reader.ReadIsInObject(ref count2)) { if (count2 != 1) { writer.WriteRaw(44); writer.WriteRaw(newLine); } writer.WriteRaw(indent[depth + 1]); writer.WritePropertyName(reader.ReadPropertyName()); writer.WriteRaw(32); WritePrittyPrint(ref reader, ref writer, depth + 1); } writer.WriteRaw(newLine); writer.WriteRaw(indent[depth]); writer.WriteEndObject(); break; } case JsonToken.BeginArray: { writer.WriteBeginArray(); writer.WriteRaw(newLine); int count = 0; while (reader.ReadIsInArray(ref count)) { if (count != 1) { writer.WriteRaw(44); writer.WriteRaw(newLine); } writer.WriteRaw(indent[depth + 1]); WritePrittyPrint(ref reader, ref writer, depth + 1); } writer.WriteRaw(newLine); writer.WriteRaw(indent[depth]); writer.WriteEndArray(); break; } case JsonToken.Number: { double value3 = reader.ReadDouble(); writer.WriteDouble(value3); break; } case JsonToken.String: { string value2 = reader.ReadString(); writer.WriteString(value2); break; } case JsonToken.True: case JsonToken.False: { bool value = reader.ReadBoolean(); writer.WriteBoolean(value); break; } case JsonToken.Null: reader.ReadIsNull(); writer.WriteNull(); break; case JsonToken.EndObject: case JsonToken.EndArray: break; } } } private static int FillFromStream(Stream input, ref byte[] buffer) { int num = 0; checked { int num2; while ((num2 = input.Read(buffer, num, buffer.Length - num)) > 0) { num += num2; if (num == buffer.Length) { BinaryUtil.FastResize(ref buffer, num * 2); } } return num; } } } public enum JsonToken : byte { None, BeginObject, EndObject, BeginArray, EndArray, Number, String, True, False, Null, ValueSeparator, NameSeparator } public struct JsonWriter { private static readonly byte[] emptyBytes = new byte[0]; internal byte[] buffer; internal int offset; public int CurrentOffset => offset; public void AdvanceOffset(int offset) { checked { this.offset += offset; } } public static byte[] GetEncodedPropertyName(string propertyName) { JsonWriter jsonWriter = default(JsonWriter); jsonWriter.WritePropertyName(propertyName); return jsonWriter.ToUtf8ByteArray(); } public static byte[] GetEncodedPropertyNameWithPrefixValueSeparator(string propertyName) { JsonWriter jsonWriter = default(JsonWriter); jsonWriter.WriteValueSeparator(); jsonWriter.WritePropertyName(propertyName); return jsonWriter.ToUtf8ByteArray(); } public static byte[] GetEncodedPropertyNameWithBeginObject(string propertyName) { JsonWriter jsonWriter = default(JsonWriter); jsonWriter.WriteBeginObject(); jsonWriter.WritePropertyName(propertyName); return jsonWriter.ToUtf8ByteArray(); } public static byte[] GetEncodedPropertyNameWithoutQuotation(string propertyName) { JsonWriter jsonWriter = default(JsonWriter); jsonWriter.WriteString(propertyName); ArraySegment<byte> arraySegment = jsonWriter.GetBuffer(); checked { byte[] array = new byte[arraySegment.Count - 2]; Buffer.BlockCopy(arraySegment.Array, arraySegment.Offset + 1, array, 0, array.Length); return array; } } public JsonWriter(byte[] initialBuffer) { buffer = initialBuffer; offset = 0; } public ArraySegment<byte> GetBuffer() { if (buffer == null) { return new ArraySegment<byte>(emptyBytes, 0, 0); } return new ArraySegment<byte>(buffer, 0, offset); } public byte[] ToUtf8ByteArray() { if (buffer == null) { return emptyBytes; } return BinaryUtil.FastCloneWithResize(buffer, offset); } public override string ToString() { if (buffer == null) { return null; } return Encoding.UTF8.GetString(buffer, 0, offset); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void EnsureCapacity(int appendLength) { BinaryUtil.EnsureCapacity(ref buffer, offset, appendLength); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteRaw(byte rawValue) { BinaryUtil.EnsureCapacity(ref buffer, offset, 1); buffer[checked(offset++)] = rawValue; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteRaw(byte[] rawValue) { UnsafeMemory.WriteRaw(ref this, rawValue); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteRawUnsafe(byte rawValue) { buffer[checked(offset++)] = rawValue; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteBeginArray() { BinaryUtil.EnsureCapacity(ref buffer, offset, 1); buffer[checked(offset++)] = 91; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteEndArray() { BinaryUtil.EnsureCapacity(ref buffer, offset, 1); buffer[checked(offset++)] = 93; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteBeginObject() { BinaryUtil.EnsureCapacity(ref buffer, offset, 1); buffer[checked(offset++)] = 123; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteEndObject() { BinaryUtil.EnsureCapacity(ref buffer, offset, 1); buffer[checked(offset++)] = 125; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteValueSeparator() { BinaryUtil.EnsureCapacity(ref buffer, offset, 1); buffer[checked(offset++)] = 44; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteNameSeparator() { BinaryUtil.EnsureCapacity(ref buffer, offset, 1); buffer[checked(offset++)] = 58; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WritePropertyName(string propertyName) { WriteString(propertyName); WriteNameSeparator(); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteQuotation() { BinaryUtil.EnsureCapacity(ref buffer, offset, 1); buffer[checked(offset++)] = 34; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteNull() { BinaryUtil.EnsureCapacity(ref buffer, offset, 4); buffer[offset] = 110; checked { buffer[offset + 1] = 117; buffer[offset + 2] = 108; buffer[offset + 3] = 108; offset += 4; } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteBoolean(bool value) { checked { if (value) { BinaryUtil.EnsureCapacity(ref buffer, offset, 4); buffer[offset] = 116; buffer[offset + 1] = 114; buffer[offset + 2] = 117; buffer[offset + 3] = 101; offset += 4; } else { BinaryUtil.EnsureCapacity(ref buffer, offset, 5); buffer[offset] = 102; buffer[offset + 1] = 97; buffer[offset + 2] = 108; buffer[offset + 3] = 115; buffer[offset + 4] = 101; offset += 5; } } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteTrue() { BinaryUtil.EnsureCapacity(ref buffer, offset, 4); buffer[offset] = 116; checked { buffer[offset + 1] = 114; buffer[offset + 2] = 117; buffer[offset + 3] = 101; offset += 4; } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteFalse() { BinaryUtil.EnsureCapacity(ref buffer, offset, 5); buffer[offset] = 102; checked { buffer[offset + 1] = 97; buffer[offset + 2] = 108; buffer[offset + 3] = 115; buffer[offset + 4] = 101; offset += 5; } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteSingle(float value) { checked { offset += DoubleToStringConverter.GetBytes(ref buffer, offset, value); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteDouble(double value) { checked { offset += DoubleToStringConverter.GetBytes(ref buffer, offset, value); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteByte(byte value) { WriteUInt64(value); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteUInt16(ushort value) { WriteUInt64(value); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteUInt32(uint value) { WriteUInt64(value); } public void WriteUInt64(ulong value) { checked { offset += NumberConverter.WriteUInt64(ref buffer, offset, value); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteSByte(sbyte value) { WriteInt64(value); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteInt16(short value) { WriteInt64(value); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteInt32(int value) { WriteInt64(value); } public void WriteInt64(long value) { checked { offset += NumberConverter.WriteInt64(ref buffer, offset, value); } } public void WriteString(string value) { if (value == null) { WriteNull(); return; } int num = offset; checked { int num2 = StringEncoding.UTF8.GetMaxByteCount(value.Length) + 2; BinaryUtil.EnsureCapacity(ref buffer, num, num2); int num3 = 0; _ = value.Length; buffer[offset++] = 34; for (int i = 0; i < value.Length; i++) { byte b = 0; switch (value[i]) { case '"': b = 34; break; case '\\': b = 92; break; case '\b': b = 98; break; case '\f': b = 102; break; case '\n': b = 110; break; case '\r': b = 114; break; case '\t': b = 116; break; default: continue; } num2 += 2; BinaryUtil.EnsureCapacity(ref buffer, num, num2); offset += StringEncoding.UTF8.GetBytes(value, num3, i - num3, buffer, offset); num3 = i + 1; buffer[offset++] = 92; buffer[offset++] = b; } if (num3 != value.Length) { offset += StringEncoding.UTF8.GetBytes(value, num3, value.Length - num3, buffer, offset); } buffer[offset++] = 34; } } } } namespace Utf8Json.Resolvers { public sealed class AttributeFormatterResolver : IJsonFormatterResolver { private static class FormatterCache<T> { public static readonly IJsonFormatter<T> formatter; static FormatterCache() { JsonFormatterAttribute customAttribute = typeof(T).GetTypeInfo().GetCustomAttribute<JsonFormatterAttribute>(); if (customAttribute == null) { return; } try { if (customAttribute.FormatterType.IsGenericType && !customAttribute.FormatterType.GetTypeInfo().IsConstructedGenericType()) { formatter = (IJsonFormatter<T>)Activator.CreateInstance(customAttribute.FormatterType.MakeGenericType(typeof(T)), customAttribute.Arguments); } else { formatter = (IJsonFormatter<T>)Activator.CreateInstance(customAttribute.FormatterType, customAttribute.Arguments); } } catch (Exception innerException) { throw new InvalidOperationException("Can not create formatter from JsonFormatterAttribute, check the target formatter is public and has constructor with right argument. FormatterType:" + customAttribute.FormatterType.Name, innerException); } } } public static IJsonFormatterResolver Instance = new AttributeFormatterResolver(); private AttributeFormatterResolver() { } public IJsonFormatter<T> GetFormatter<T>() { return FormatterCache<T>.formatter; } } public sealed class BuiltinResolver : IJsonFormatterResolver { private static class FormatterCache<T> { public static readonly IJsonFormatter<T> formatter; static FormatterCache() { formatter = (IJsonFormatter<T>)BuiltinResolverGetFormatterHelper.GetFormatter(typeof(T)); } } internal static class BuiltinResolverGetFormatterHelper { private static readonly Dictionary<Type, object> formatterMap = new Dictionary<Type, object> { { typeof(short), Int16Formatter.Default }, { typeof(int), Int32Formatter.Default }, { typeof(long), Int64Formatter.Default }, { typeof(ushort), UInt16Formatter.Default }, { typeof(uint), UInt32Formatter.Default }, { typeof(ulong), UInt64Formatter.Default }, { typeof(float), SingleFormatter.Default }, { typeof(double), DoubleFormatter.Default }, { typeof(bool), BooleanFormatter.Default }, { typeof(byte), ByteFormatter.Default }, { typeof(sbyte), SByteFormatter.Default }, { typeof(short?), NullableInt16Formatter.Default }, { typeof(int?), NullableInt32Formatter.Default }, { typeof(long?), NullableInt64Formatter.Default }, { typeof(ushort?), NullableUInt16Formatter.Default }, { typeof(uint?), NullableUInt32Formatter.Default }, { typeof(ulong?), NullableUInt64Formatter.Default }, { typeof(float?), NullableSingleFormatter.Default }, { typeof(double?), NullableDoubleFormatter.Default }, { typeof(bool?), NullableBooleanFormatter.Default }, { typeof(byte?), NullableByteFormatter.Default }, { typeof(sbyte?), NullableSByteFormatter.Default }, { typeof(DateTime), ISO8601DateTimeFormatter.Default }, { typeof(TimeSpan), ISO8601TimeSpanFormatter.Default }, { typeof(DateTimeOffset), ISO8601DateTimeOffsetFormatter.Default }, { typeof(DateTime?), new StaticNullableFormatter<DateTime>(ISO8601DateTimeFormatter.Default) }, { typeof(TimeSpan?), new StaticNullableFormatter<TimeSpan>(ISO8601TimeSpanFormatter.Default) }, { typeof(DateTimeOffset?), new StaticNullableFormatter<DateTimeOffset>(ISO8601DateTimeOffsetFormatter.Default) }, { typeof(string), NullableStringFormatter.Default }, { typeof(char), CharFormatter.Default }, { typeof(char?), NullableCharFormatter.Default }, { typeof(decimal), DecimalFormatter.Default }, { typeof(decimal?), new StaticNullableFormatter<decimal>(DecimalFormatter.Default) }, { typeof(Guid), GuidFormatter.Default }, { typeof(Guid?), new StaticNullableFormatter<Guid>(GuidFormatter.Default) }, { typeof(Uri), UriFormatter.Default }, { typeof(Version), VersionFormatter.Default }, { typeof(System.Text.StringBuilder), StringBuilderFormatter.Default }, { typeof(BitArray), BitArrayFormatter.Default }, { typeof(Type), TypeFormatter.Default }, { typeof(byte[]), ByteArrayFormatter.Default }, { typeof(short[]), Int16ArrayFormatter.Default }, { typeof(int[]), Int32ArrayFormatter.Default }, { typeof(long[]), Int64ArrayFormatter.Default }, { typeof(ushort[]), UInt16ArrayFormatter.Default }, { typeof(uint[]), UInt32ArrayFormatter.Default }, { typeof(ulong[]), UInt64ArrayFormatter.Default }, { typeof(float[]), SingleArrayFormatter.Default }, { typeof(double[]), DoubleArrayFormatter.Default }, { typeof(bool[]), BooleanArrayFormatter.Default }, { typeof(sbyte[]), SByteArrayFormatter.Default }, { typeof(char[]), CharArrayFormatter.Default }, { typeof(string[]), NullableStringArrayFormatter.Default }, { typeof(List<short>), new ListFormatter<short>() }, { typeof(List<int>), new ListFormatter<int>() }, { typeof(List<long>), new ListFormatter<long>() }, { typeof(List<ushort>), new ListFormatter<ushort>() }, { typeof(List<uint>), new ListFormatter<uint>() }, { typeof(List<ulong>), new ListFormatter<ulong>() }, { typeof(List<float>), new ListFormatter<float>() }, { typeof(List<double>), new ListFormatter<double>() }, { typeof(List<bool>), new ListFormatter<bool>() }, { typeof(List<byte>), new ListFormatter<byte>() }, { typeof(List<sbyte>), new ListFormatter<sbyte>() }, { typeof(List<DateTime>), new ListFormatter<DateTime>() }, { typeof(List<char>), new ListFormatter<char>() }, { typeof(List<string>), new ListFormatter<string>() }, { typeof(ArraySegment<byte>), ByteArraySegmentFormatter.Default }, { typeof(ArraySegment<byte>?), new StaticNullableFormatter<ArraySegment<byte>>(ByteArraySegmentFormatter.Default) }, { typeof(BigInteger), BigIntegerFormatter.Default }, { typeof(BigInteger?), new StaticNullableFormatter<BigInteger>(BigIntegerFormatter.Default) }, { typeof(Complex), ComplexFormatter.Default }, { typeof(Complex?), new StaticNullableFormatter<Complex>(ComplexFormatter.Default) }, { typeof(ExpandoObject), ExpandoObjectFormatter.Default }, { typeof(Task), TaskUnitFormatter.Default } }; internal static object GetFormatter(Type t) { if (formatterMap.TryGetValue(t, out var value)) { return value; } return null; } } public static readonly IJsonFormatterResolver Instance = new BuiltinResolver(); private BuiltinResolver() { } public IJsonFormatter<T> GetFormatter<T>() { return FormatterCache<T>.formatter; } } public sealed class CompositeResolver : IJsonFormatterResolver { private static class FormatterCache<T> { public static readonly IJsonFormatter<T> formatter; static FormatterCache() { isFreezed = true; IJsonFormatter[] formatters = CompositeResolver.formatters; foreach (IJsonFormatter jsonFormatter in formatters) { foreach (Type implementedInterface in jsonFormatter.GetType().GetTypeInfo().ImplementedInterfaces) { TypeInfo typeInfo = implementedInterface.GetTypeInfo(); if (typeInfo.IsGenericType && typeInfo.GenericTypeArguments[0] == typeof(T)) { formatter = (IJsonFormatter<T>)jsonFormatter; return; } } } IJsonFormatterResolver[] resolvers = CompositeResolver.resolvers; for (int i = 0; i < resolvers.Length; i++) { IJsonFormatter<T> jsonFormatter2 = resolvers[i].GetFormatter<T>(); if (jsonFormatter2 != null) { formatter = jsonFormatter2; break; } } } } public static readonly CompositeResolver Instance = new CompositeResolver(); private static bool isFreezed = false; private static IJsonFormatter[] formatters = new IJsonFormatter[0]; private static IJsonFormatterResolver[] resolvers = new IJsonFormatterResolver[0]; private CompositeResolver() { } public static void Register(params IJsonFormatterResolver[] resolvers) { if (isFreezed) { throw new InvalidOperationException("Register must call on startup(before use GetFormatter<T>)."); } CompositeResolver.resolvers = resolvers; } public static void Register(params IJsonFormatter[] formatters) { if (isFreezed) { throw new InvalidOperationException("Register must call on startup(before use GetFormatter<T>)."); } CompositeResolver.formatters = formatters; } public static void Register(IJsonFormatter[] formatters, IJsonFormatterResolver[] resolvers) { if (isFreezed) { throw new InvalidOperationException("Register must call on startup(before use GetFormatter<T>)."); } CompositeResolver.resolvers = resolvers; CompositeResolver.formatters = formatters; } public static void RegisterAndSetAsDefault(params IJsonFormatterResolver[] resolvers) { Register(resolvers); JsonSerializer.SetDefaultResolver(Instance); } public static void RegisterAndSetAsDefault(params IJsonFormatter[] formatters) { Register(formatters); JsonSerializer.SetDefaultResolver(Instance); } public static void RegisterAndSetAsDefault(IJsonFormatter[] formatters, IJsonFormatterResolver[] resolvers) { Register(formatters); Register(resolvers); JsonSerializer.SetDefaultResolver(Instance); } public static IJsonFormatterResolver Create(params IJsonFormatter[] formatters) { return Create(formatters, new IJsonFormatterResolver[0]); } public static IJsonFormatterResolver Create(params IJsonFormatterResolver[] resolvers) { return Create(new IJsonFormatter[0], resolvers); } public static IJsonFormatterResolver Create(IJsonFormatter[] formatters, IJsonFormatterResolver[] resolvers) { return DynamicCompositeResolver.Create(formatters, resolvers); } public IJsonFormatter<T> GetFormatter<T>() { return FormatterCache<T>.formatter; } } public abstract class DynamicCompositeResolver : IJsonFormatterResolver { private const string ModuleName = "Utf8Json.Resolvers.DynamicCompositeResolver"; private static readonly DynamicAssembly assembly; public readonly IJsonFormatter[] formatters; public readonly IJsonFormatterResolver[] resolvers; static DynamicCompositeResolver() { assembly = new DynamicAssembly("Utf8Json.Resolvers.DynamicCompositeResolver"); } public static IJsonFormatterResolver Create(IJsonFormatter[] formatters, IJsonFormatterResolver[] resolvers) { string text = Guid.NewGuid().ToString().Replace("-", ""); TypeBuilder typeBuilder = assembly.DefineType("DynamicCompositeResolver_" + text, TypeAttributes.Public | TypeAttributes.Sealed, typeof(DynamicCompositeResolver)); TypeBuilder typeBuilder2 = assembly.DefineType("DynamicCompositeResolverCache_" + text, TypeAttributes.Public | TypeAttributes.Sealed, null); GenericTypeParameterBuilder genericTypeParameterBuilder = typeBuilder2.DefineGenericParameters("T")[0]; FieldBuilder fieldInfo = typeBuilder.DefineField("instance", typeBuilder, FieldAttributes.Public | FieldAttributes.Static); FieldBuilder field = typeBuilder2.DefineField("formatter", typeof(IJsonFormatter<>).MakeGenericType(genericTypeParameterBuilder), FieldAttributes.Public | FieldAttributes.Static); ILGenerator iLGenerator = typeBuilder2.DefineConstructor(MethodAttributes.Static, CallingConventions.Standard, Type.EmptyTypes).GetILGenerator(); iLGenerator.EmitLdsfld(fieldInfo); iLGenerator.EmitCall(typeof(DynamicCompositeResolver).GetMethod("GetFormatterLoop").MakeGenericMethod(genericTypeParameterBuilder)); iLGenerator.Emit(OpCodes.Stsfld, field); iLGenerator.Emit(OpCodes.Ret); Type type = typeBuilder2.CreateTypeInfo().AsType(); ILGenerator iLGenerator2 = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, new Type[2] { typeof(IJsonFormatter[]), typeof(IJsonFormatterResolver[]) }).GetILGenerator(); iLGenerator2.EmitLdarg(0); iLGenerator2.EmitLdarg(1); iLGenerator2.EmitLdarg(2); iLGenerator2.Emit(OpCodes.Call, typeof(DynamicCompositeResolver).GetConstructors()[0]); iLGenerator2.Emit(OpCodes.Ret); MethodBuilder methodBuilder = typeBuilder.DefineMethod("GetFormatter", MethodAttributes.Public | MethodAttributes.Virtual); GenericTypeParameterBuilder genericTypeParameterBuilder2 = methodBuilder.DefineGenericParameters("T")[0]; methodBuilder.SetReturnType(typeof(IJsonFormatter<>).MakeGenericType(genericTypeParameterBuilder2)); ILGenerator iLGenerator3 = methodBuilder.GetILGenerator(); FieldInfo field2 = TypeBuilder.GetField(type.MakeGenericType(genericTypeParameterBuilder2), type.GetField("formatter", BindingFlags.Static | BindingFlags.Public | BindingFlags.GetField)); iLGenerator3.EmitLdsfld(field2); iLGenerator3.Emit(OpCodes.Ret); object obj = Activator.CreateInstance(typeBuilder.CreateTypeInfo().AsType(), new object[2] { formatters, resolvers }); obj.GetType().GetField("instance", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic).SetValue(null, obj); return (IJsonFormatterResolver)obj; } public DynamicCompositeResolver(IJsonFormatter[] formatters, IJsonFormatterResolver[] resolvers) { this.formatters = formatters; this.resolvers = resolvers; } public IJsonFormatter<T> GetFormatterLoop<T>() { IJsonFormatter[] array = formatters; foreach (IJsonFormatter jsonFormatter in array) { foreach (Type implementedInterface in jsonFormatter.GetType().GetTypeInfo().ImplementedInterfaces) { TypeInfo typeInfo = implementedInterface.GetTypeInfo(); if (typeInfo.IsGenericType && typeInfo.GenericTypeArguments[0] == typeof(T)) { return (IJsonFormatter<T>)jsonFormatter; } } } IJsonFormatterResolver[] array2 = resolvers; for (int i = 0; i < array2.Length; i++) { IJsonFormatter<T> formatter = array2[i].GetFormatter<T>(); if (formatter != null) { return formatter; } } return null; } public abstract IJsonFormatter<T> GetFormatter<T>(); } public sealed class DynamicGenericResolver : IJsonFormatterResolver { private static class FormatterCache<T> { public static readonly IJsonFormatter<T> formatter; static FormatterCache() { formatter = (IJsonFormatter<T>)DynamicGenericResolverGetFormatterHelper.GetFormatter(typeof(T)); } } public static readonly IJsonFormatterResolver Instance = new DynamicGenericResolver(); private DynamicGenericResolver() { } public IJsonFormatter<T> GetFormatter<T>() { return FormatterCache<T>.formatter; } } public static class DynamicObjectResolver { public static readonly IJsonFormatterResolver Default = DynamicObjectResolverAllowPrivateFalseExcludeNullFalseNameMutateOriginal.Instance; public static readonly IJsonFormatterResolver CamelCase = DynamicObjectResolverAllowPrivateFalseExcludeNullFalseNameMutateCamelCase.Instance; public static readonly IJsonFormatterResolver SnakeCase = DynamicObjectResolverAllowPrivateFalseExcludeNullFalseNameMutateSnakeCase.Instance; public static readonly IJsonFormatterResolver ExcludeNull = DynamicObjectResolverAllowPrivateFalseExcludeNullTrueNameMutateOriginal.Instance; public static readonly IJsonFormatterResolver ExcludeNullCamelCase = DynamicObjectResolverAllowPrivateFalseExcludeNullTrueNameMutateCamelCase.Instance; public static readonly IJsonFormatterResolver ExcludeNullSnakeCase = DynamicObjectResolverAllowPrivateFalseExcludeNullTrueNameMutateSnakeCase.Instance; public static readonly IJsonFormatterResolver AllowPrivate = DynamicObjectResolverAllowPrivateTrueExcludeNullFalseNameMutateOriginal.Instance; public static readonly IJsonFormatterResolver AllowPrivateCamelCase = DynamicObjectResolverAllowPrivateTrueExcludeNullFalseNameMutateCamelCase.Instance; public static readonly IJsonFormatterResolver AllowPrivateSnakeCase = DynamicObjectResolverAllowPrivateTrueExcludeNullFalseNameMutateSnakeCase.Instance; public static readonly IJsonFormatterResolver AllowPrivateExcludeNull = DynamicObjectResolverAllowPrivateTrueExcludeNullTrueNameMutateOriginal.Instance; public static readonly IJsonFormatterResolver AllowPrivateExcludeNullCamelCase = DynamicObjectResolverAllowPrivateTrueExcludeNullTrueNameMutateCamelCase.Instance; public static readonly IJsonFormatterResolver AllowPrivateExcludeNullSnakeCase = DynamicObjectResolverAllowPrivateTrueExcludeNullTrueNameMutateSnakeCase.Instance; } public static class EnumResolver { public static readonly IJsonFormatterResolver Default = EnumDefaultResolver.Instance; public static readonly IJsonFormatterResolver UnderlyingValue = EnumUnderlyingValueResolver.Instance; } public static class StandardResolver { public static readonly IJsonFormatterResolver Default = DefaultStandardResolver.Instance; public static readonly IJsonFormatterResolver CamelCase = CamelCaseStandardResolver.Instance; public static readonly IJsonFormatterResolver SnakeCase = SnakeCaseStandardResolver.Instance; public static readonly IJsonFormatterResolver ExcludeNull = ExcludeNullStandardResolver.Instance; public static readonly IJsonFormatterResolver ExcludeNullCamelCase = ExcludeNullCamelCaseStandardResolver.Instance; public static readonly IJsonFormatterResolver ExcludeNullSnakeCase = ExcludeNullSnakeCaseStandardResolver.Instance; public static readonly IJsonFormatterResolver AllowPrivate = AllowPrivateStandardResolver.Instance; public static readonly IJsonFormatterResolver AllowPrivateCamelCase = AllowPrivateCamelCaseStandardResolver.Instance; public static readonly IJsonFormatterResolver AllowPrivateSnakeCase = AllowPrivateSnakeCaseStandardResolver.Instance; public static readonly IJsonFormatterResolver AllowPrivateExcludeNull = AllowPrivateExcludeNullStandardResolver.Instance; public static readonly IJsonFormatterResolver AllowPrivateExcludeNullCamelCase = AllowPrivateExcludeNullCamelCaseStandardResolver.Instance; public static readonly IJsonFormatterResolver AllowPrivateExcludeNullSnakeCase = AllowPrivateExcludeNullSnakeCaseStandardResolver.Instance; } } namespace Utf8Json.Resolvers.Internal { internal static class DynamicGenericResolverGetFormatterHelper { private static readonly Dictionary<Type, Type> formatterMap = new Dictionary<Type, Type> { { typeof(List<>), typeof(ListFormatter<>) }, { typeof(LinkedList<>), typeof(LinkedListFormatter<>) }, { typeof(Queue<>), typeof(QeueueFormatter<>) }, { typeof(Stack<>), typeof(StackFormatter<>) }, { typeof(HashSet<>), typeof(HashSetFormatter<>) }, { typeof(ReadOnlyCollection<>), typeof(ReadOnlyCollectionFormatter<>) }, { typeof(IList<>), typeof(InterfaceListFormatter<>) }, { typeof(ICollection<>), typeof(InterfaceCollectionFormatter<>) }, { typeof(IEnumerable<>), typeof(InterfaceEnumerableFormatter<>) }, { typeof(Dictionary<, >), typeof(DictionaryFormatter<, >) }, { typeof(IDictionary<, >), typeof(InterfaceDictionaryFormatter<, >) }, { typeof(SortedDictionary<, >), typeof(SortedDictionaryFormatter<, >) }, { typeof(SortedList<, >), typeof(SortedListFormatter<, >) }, { typeof(ILookup<, >), typeof(InterfaceLookupFormatter<, >) }, { typeof(IGrouping<, >), typeof(InterfaceGroupingFormatter<, >) }, { typeof(ObservableCollection<>), typeof(ObservableCollectionFormatter<>) }, { typeof(ReadOnlyObservableCollection<>), typeof(ReadOnlyObservableCollectionFormatter<>) }, { typeof(IReadOnlyList<>), typeof(InterfaceReadOnlyListFormatter<>) }, { typeof(IReadOnlyCollection<>), typeof(InterfaceReadOnlyCollectionFormatter<>) }, { typeof(ISet<>), typeof(InterfaceSetFormatter<>) }, { typeof(ConcurrentBag<>), typeof(ConcurrentBagFormatter<>) }, { typeof(ConcurrentQueue<>), typeof(ConcurrentQueueFormatter<>) }, { typeof(ConcurrentStack<>), typeof(ConcurrentStackFormatter<>) }, { typeof(ReadOnlyDictionary<, >), typeof(ReadOnlyDictionaryFormatter<, >) }, { typeof(IReadOnlyDictionary<, >), typeof(InterfaceReadOnlyDictionaryFormatter<, >) }, { typeof(ConcurrentDictionary<, >), typeof(ConcurrentDictionaryFormatter<, >) }, { typeof(Lazy<>), typeof(LazyFormatter<>) }, { typeof(Task<>), typeof(TaskValueFormatter<>) } }; internal static object GetFormatter(Type t) { TypeInfo typeInfo = t.GetTypeInfo(); if (t.IsArray) { switch (t.GetArrayRank()) { case 1: if (t.GetElementType() == typeof(byte)) { return ByteArrayFormatter.Default; } return Activator.CreateInstance(typeof(ArrayFormatter<>).MakeGenericType(t.GetElementType())); case 2: return Activator.CreateInstance(typeof(TwoDimentionalArrayFormatter<>).MakeGenericType(t.GetElementType())); case 3: return Activator.CreateInstance(typeof(ThreeDimentionalArrayFormatter<>).MakeGenericType(t.GetElementType())); case 4: return Activator.CreateInstance(typeof(FourDimentionalArrayFormatter<>).MakeGenericType(t.GetElementType())); default: return null; } } if (typeInfo.IsGenericType) { Type genericTypeDefinition = typeInfo.GetGenericTypeDefinition(); bool flag = genericTypeDefinition.GetTypeInfo().IsNullable(); Type type = (flag ? typeInfo.GenericTypeArguments[0] : null); if (genericTypeDefinition == typeof(KeyValuePair<, >)) { return CreateInstance(typeof(KeyValuePairFormatter<, >), typeInfo.GenericTypeArguments); } if (flag && type.GetTypeInfo().IsConstructedGenericType() && type.GetGenericTypeDefinition() == typeof(KeyValuePair<, >)) { return CreateInstance(typeof(NullableFormatter<>), new Type[1] { type }); } if (genericTypeDefinition == typeof(ValueTask<>)) { return CreateInstance(typeof(ValueTaskFormatter<>), typeInfo.GenericTypeArguments); } if (flag && type.IsConstructedGenericType && type.GetGenericTypeDefinition() == typeof(ValueTask<>)) { return CreateInstance(typeof(NullableFormatter<>), new Type[1] { type }); } if (typeInfo.FullName.StartsWith("System.Tuple")) { Type genericType = null; switch (typeInfo.GenericTypeArguments.Length) { case 1: genericType = typeof(TupleFormatter<>); break; case 2: genericType = typeof(TupleFormatter<, >); break; case 3: genericType = typeof(TupleFormatter<, , >); break; case 4: genericType = typeof(TupleFormatter<, , , >); break; case 5: genericType = typeof(TupleFormatter<, , , , >); break; case 6: genericType = typeof(TupleFormatter<, , , , , >); break; case 7: genericType = typeof(TupleFormatter<, , , , , , >); break; case 8: genericType = typeof(TupleFormatter<, , , , , , , >); break; } return CreateInstance(genericType, typeInfo.GenericTypeArguments); } if (typeInfo.FullName.StartsWith("System.ValueTuple")) { Type genericType2 = null; switch (typeInfo.GenericTypeArguments.Length) { case 1: genericType2 = typeof(ValueTupleFormatter<>); break; case 2: genericType2 = typeof(ValueTupleFormatter<, >); break; case 3: genericType2 = typeof(ValueTupleFormatter<, , >); break; case 4: genericType2 = typeof(ValueTupleFormatter<, , , >); break; case 5: genericType2 = typeof(ValueTupleFormatter<, , , , >); break; case 6: genericType2 = typeof(ValueTupleFormatter<, , , , , >); break; case 7: genericType2 = typeof(ValueTupleFormatter<, , , , , , >); break; case 8: genericType2 = typeof(ValueTupleFormatter<, , , , , , , >); break; } return CreateInstance(genericType2, typeInfo.GenericTypeArguments); } if (genericTypeDefinition == typeof(ArraySegment<>)) { if (typeInfo.GenericTypeArguments[0] == typeof(byte)) { return ByteArraySegmentFormatter.Default; } return CreateInstance(typeof(ArraySegmentFormatter<>), typeInfo.GenericTypeArguments); } if (flag && type.GetTypeInfo().IsConstructedGenericType() && type.GetGenericTypeDefinition() == typeof(ArraySegment<>)) { if (type == typeof(ArraySegment<byte>)) { return new StaticNullableFormatter<ArraySegment<byte>>(ByteArraySegmentFormatter.Default); } return CreateInstance(typeof(NullableFormatter<>), new Type[1] { type }); } if (formatterMap.TryGetValue(genericTypeDefinition, out var value)) { return CreateInstance(value, typeInfo.GenericTypeArguments); } if (typeInfo.GenericTypeArguments.Length == 1 && typeInfo.ImplementedInterfaces.Any((Type x) => x.GetTypeInfo().IsConstructedGenericType() && x.GetGenericTypeDefinition() == typeof(ICollection<>)) && typeInfo.DeclaredConstructors.Any((ConstructorInfo x) => x.GetParameters().Length == 0)) { Type type2 = typeInfo.GenericTypeArguments[0]; return CreateInstance(typeof(GenericCollectionFormatter<, >), new Type[2] { type2, t }); } if (typeInfo.GenericTypeArguments.Length == 2 && typeInfo.ImplementedInterfaces.Any((Type x) => x.GetTypeInfo().IsConstructedGenericType() && x.GetGenericTypeDefinition() == typeof(IDictionary<, >)) && typeInfo.DeclaredConstructors.Any((ConstructorInfo x) => x.GetParameters().Length == 0)) { Type type3 = typeInfo.GenericTypeArguments[0]; Type type4 = typeInfo.GenericTypeArguments[1]; return CreateInstance(typeof(GenericDictionaryFormatter<, , >), new Type[3] { type3, type4, t }); } } else { if (t == typeof(IEnumerable)) { return NonGenericInterfaceEnumerableFormatter.Default; } if (t == typeof(ICollection)) { return NonGenericInterfaceCollectionFormatter.Default; } if (t == typeof(IList)) { return NonGenericInterfaceListFormatter.Default; } if (t == typeof(IDictionary)) { return NonGenericInterfaceDictionaryFormatter.Default; } if (typeof(IList).GetTypeInfo().IsAssignableFrom(typeInfo) && typeInfo.DeclaredConstructors.Any((ConstructorInfo x) => x.GetParameters().Length == 0)) { return Activator.CreateInstance(typeof(NonGenericListFormatter<>).MakeGenericType(t)); } if (typeof(IDictionary).GetTypeInfo().IsAssignableFrom(typeInfo) && typeInfo.DeclaredConstructors.Any((ConstructorInfo x) => x.GetParameters().Length == 0)) { return Activator.CreateInstance(typeof(NonGenericDictionaryFormatter<>).MakeGenericType(t)); } } return null; } private static object CreateInstance(Type genericType, Type[] genericTypeArguments, params object[] arguments) { return Activator.CreateInstance(genericType.MakeGenericType(genericTypeArguments), arguments); } } internal sealed class DynamicObjectResolverAllowPrivateFalseExcludeNullFalseNameMutateOriginal : IJsonFormatterResolver { private static class FormatterCache<T> { public static readonly IJsonFormatter<T> formatter; static FormatterCache() { formatter = (IJsonFormatter<T>)DynamicObjectTypeBuilder.BuildFormatterToAssembly<T>(assembly, Instance, nameMutator, excludeNull); } } public static readonly IJsonFormatterResolver Instance; private static readonly Func<string, string> nameMutator; private static readonly bool excludeNull; private const string ModuleName = "Utf8Json.Resolvers.DynamicObjectResolverAllowPrivateFalseExcludeNullFalseNameMutateOriginal"; private static readonly DynamicAssembly assembly; static DynamicObjectResolverAllowPrivateFalseExcludeNullFalseNameMutateOriginal() { Instance = new DynamicObjectResolverAllowPrivateFalseExcludeNullFalseNameMutateOriginal(); nameMutator = StringMutator.Original; excludeNull = false; assembly = new DynamicAssembly("Utf8Json.Resolvers.DynamicObjectResolverAllowPrivateFalseExcludeNullFalseNameMutateOriginal"); } private DynamicObjectResolverAllowPrivateFalseExcludeNullFalseNameMutateOriginal() { } public IJsonFormatter<T> GetFormatter<T>() { return FormatterCache<T>.formatter; } } internal sealed class DynamicObjectResolverAllowPrivateFalseExcludeNullFalseNameMutateCamelCase : IJsonFormatterResolver { private static class FormatterCache<T> { public static readonly IJsonFormatter<T> formatter; static FormatterCache() { formatter = (IJsonFormatter<T>)DynamicObjectTypeBuilder.BuildFormatterToAssembly<T>(assembly, Instance, nameMutator, excludeNull); } } public static readonly IJsonFormatterResolver Instance; private static readonly Func<string, string> nameMutator; private static readonly bool excludeNull; private const string ModuleName = "Utf8Json.Resolvers.DynamicObjectResolverAllowPrivateFalseExcludeNullFalseNameMutateCamelCase"; private static readonly DynamicAssembly assembly; static DynamicObjectResolverAllowPrivateFalseExcludeNullFalseNameMutateCamelCase() { Instance = new DynamicObjectResolverAllowPrivateFalseExcludeNullFalseNameMutateCamelCase(); nameMutator = StringMutator.ToCamelCase; excludeNull = false; assembly = new DynamicAssembly("Utf8Json.Resolvers.DynamicObjectResolverAllowPrivateFalseExcludeNullFalseNameMutateCamelCase"); } private DynamicObjectResolverAllowPrivateFalseExcludeNullFalseNameMutateCamelCase() { } public IJsonFormatter<T> GetFormatter<T>() { return FormatterCache<T>.formatter; } } internal sealed class DynamicObjectResolverAllowPrivateFalseExcludeNullFalseNameMutateSnakeCase : IJsonFormatterResolver { private static class FormatterCache<T> { public static readonly IJsonFormatter<T> formatter; static FormatterCache() { formatter = (IJsonFormatter<T>)DynamicObjectTypeBuilder.BuildFormatterToAssembly<T>(assembly, Instance, nameMutator, excludeNull); } } public static readonly IJsonFormatterResolver Instance; private static readonly Func<string, string> nameMutator; private static readonly bool excludeNull; private const string ModuleName = "Utf8Json.Resolvers.DynamicObjectResolverAllowPrivateFalseExcludeNullFalseNameMutateSnakeCase"; private static readonly DynamicAssembly assembly; static DynamicObjectResolverAllowPrivateFalseExcludeNullFalseNameMutateSnakeCase() { Instance = new DynamicObjectResolverAllowPrivateFalseExcludeNullFalseNameMutateSnakeCase(); nameMutator = StringMutator.ToSnakeCase; excludeNull = false; assembly = new DynamicAssembly("Utf8Json.Resolvers.DynamicObjectResolverAllowPrivateFalseExcludeNullFalseNameMutateSnakeCase"); } private DynamicObjectResolverAllowPrivateFalseExcludeNullFalseNameMutateSnakeCase() { } public IJsonFormatter<T> GetFormatter<T>() { return FormatterCache<T>.formatter; } } internal sealed class DynamicObjectResolverAllowPrivateFalseExcludeNullTrueNameMutateOriginal : IJsonFormatterResolver { private static class FormatterCache<T> { public static readonly IJsonFormatter<T> formatter; static FormatterCache() { formatter = (IJsonFormatter<T>)DynamicObjectTypeBuilder.BuildFormatterToAssembly<T>(assembly, Instance, nameMutator, excludeNull); } } public static readonly IJsonFormatterResolver Instance; private static readonly Func<string, string> nameMutator; private static readonly bool excludeNull; private const string ModuleName = "Utf8Json.Resolvers.DynamicObjectResolverAllowPrivateFalseExcludeNullTrueNameMutateOriginal"; private static readonly DynamicAssembly assembly; static DynamicObjectResolverAllowPrivateFalseExcludeNullTrueNameMutateOriginal() { Instance = new DynamicObjectResolverAllowPrivateFalseExcludeNullTrueNameMutateOriginal(); nameMutator = StringMutator.Original; excludeNull = true; assembly = new DynamicAssembly("Utf8Json.Resolvers.DynamicObjectResolverAllowPrivateFalseExcludeNullTrueNameMutateOriginal"); } private DynamicObjectResolverAllowPrivateFalseExcludeNullTrueNameMutateOriginal() { } public IJsonFormatter<T> GetFormatter<T>() { return FormatterCache<T>.formatter; } } internal sealed class DynamicObjectResolverAllowPrivateFalseExcludeNullTrueNameMutateCamelCase : IJsonFormatterResolver { private static class FormatterCache<T> { public static readonly IJsonFormatter<T> formatter; static FormatterCache() { formatter = (IJsonFormatter<T>)DynamicObjectTypeBuilder.BuildFormatterToAssembly<T>(assembly, Instance, nameMutator, excludeNull); } } public static readonly IJsonFormatterResolver Instance; private static readonly Func<string, string> nameMutator; private static readonly bool excludeNull; private const string ModuleName = "Utf8Json.Resolvers.DynamicObjectResolverAllowPrivateFalseExcludeNullTrueNameMutateCamelCase"; private static readonly DynamicAssembly assembly; static DynamicObjectResolverAllowPrivateFalseExcludeNullTrueNameMutateCamelCase() { Instance = new DynamicObjectResolverAllowPrivateFalseExcludeNullTrueNameMutateCamelCase(); nameMutator = StringMutator.ToCamelCase; excludeNull = true; assembly = new DynamicAssembly("Utf8Json.Resolvers.DynamicObjectResolverAllowPrivateFalseExcludeNullTrueNameMutateCamelCase"); } private DynamicObjectResolverAllowPrivateFalseExcludeNullTrueNameMutateCamelCase() { } public IJsonFormatter<T> GetFormatter<T>() { return FormatterCache<T>.formatter; } } internal sealed class DynamicObjectResolverAllowPrivateFalseExcludeNullTrueNameMutateSnakeCase : IJsonFormatterResolver { private static class FormatterCache<T> { public static readonly IJsonFormatter<T> formatter; static FormatterCache() { formatter = (IJsonFormatter<T>)DynamicObjectTypeBuilder.BuildFormatterToAssembly<T>(assembly, Instance, nameMutator, excludeNull); } } public static readonly IJsonFormatterResolver Instance; private static readonly Func<string, string> nameMutator; private static readonly bool excludeNull; private const string ModuleName = "Utf8Json.Resolvers.DynamicObjectResolverAllowPrivateFalseExcludeNullTrueNameMutateSnakeCase"; private static readonly DynamicAssembly assembly; static DynamicObjectResolverAllowPrivateFalseExcludeNullTrueNameMutateSnakeCase() { Instance = new DynamicObjectResolverAllowPrivateFalseExcludeNullTrueNameMutateSnakeCase(); nameMutator = StringMutator.ToSnakeCase; excludeNull = true; assembly = new DynamicAssembly("Utf8Json.Resolvers.DynamicObjectResolverAllowPrivateFalseExcludeNullTrueNameMutateSnakeCase"); } private DynamicObjectResolverAllowPrivateFalseExcludeNullTrueNameMutateSnakeCase() { } public IJsonFormatter<T> GetFormatter<T>() { return FormatterCache<T>.formatter; } } internal sealed class DynamicObjectResolverAllowPrivateTrueExcludeNullFalseNameMutateOriginal : IJsonFormatterResolver { private static class FormatterCache<T> { public static readonly IJsonFormatter<T> formatter; static FormatterCache() { formatter = (IJsonFormatter<T>)DynamicObjectTypeBuilder.BuildFormatterToDynamicMethod<T>(Instance, nameMutator, excludeNull, allowPrivate: true); } } public static readonly IJsonFormatterResolver Instance = new DynamicObjectResolverAllowPrivateTrueExcludeNullFalseNameMutateOriginal(); private static readonly Func<string, string> nameMutator = StringMutator.Original; private static readonly bool excludeNull = false; public IJsonFormatter<T> GetFormatter<T>() { return FormatterCache<T>.formatter; } } internal sealed class DynamicObjectResolverAllowPrivateTrueExcludeNullFalseNameMutateCamelCase : IJsonFormatterResolver { private static class FormatterCache<T> { public static readonly IJsonFormatter<T> formatter; static FormatterCache() { formatter = (IJsonFormatter<T>)DynamicObjectTypeBuilder.BuildFormatterToDynamicMethod<T>(Instance, nameMutator, excludeNull, allowPrivate: true); } } public static readonly IJsonFormatterResolver Instance = new DynamicObjectResolverAllowPrivateTrueExcludeNullFalseNameMutateCamelCase(); private static readonly Func<string, string> nameMutator = StringMutator.ToCamelCase; private static readonly bool excludeNull = false; public IJsonFormatter<T> GetFormatter<T>() { return FormatterCache<T>.formatter; } } internal sealed class DynamicObjectResolverAllowPrivateTrueExcludeNullFalseNameMutateSnakeCase : IJsonFormatterResolver { private static class FormatterCache<T> { public static readonly IJsonFormatter<T> formatter; static FormatterCache() { formatter = (IJsonFormatter<T>)DynamicObjectTypeBuilder.BuildFormatterToDynamicMethod<T>(Instance, nameMutator, excludeNull, allowPrivate: true); } } public static readonly IJsonFormatterResolver Instance = new DynamicObjectResolverAllowPrivateTrueExcludeNullFalseNameMutateSnakeCase(); private static readonly Func<string, string> nameMutator = StringMutator.ToSnakeCase; private static readonly bool excludeNull = false; public IJsonFormatter<T> GetFormatter<T>() { return FormatterCache<T>.formatter; } } internal sealed class DynamicObjectResolverAllowPrivateTrueExcludeNullTrueNameMutateOriginal : IJsonFormatterResolver { private static class FormatterCache<T> { public static readonly IJsonFormatter<T> formatter; static FormatterCache() { formatter = (IJsonFormatter<T>)DynamicObjectTypeBuilder.BuildFormatterToDynamicMethod<T>(Instance, nameMutator, excludeNull, allowPrivate: true); } } public static readonly IJsonFormatterResolver Instance = new DynamicObjectResolverAllowPrivateTrueExcludeNullTrueNameMutateOriginal(); private static readonly Func<string, string> nameMutator = StringMutator.Original; private static readonly bool excludeNull = true; public IJsonFormatter<T> GetFormatter<T>() { return FormatterCache<T>.formatter; } } internal sealed class DynamicObjectResolverAllowPrivateTrueExcludeNullTrueNameMutateCamelCase : IJsonFormatterResolver { private static class FormatterCache<T> { public static readonly IJsonFormatter<T> formatter; static FormatterCache() { formatter = (IJsonFormatter<T>)DynamicObjectTypeBuilder.BuildFormatterToDynamicMethod<T>(Instance, nameMutator, excludeNull, allowPrivate: true); } } public static readonly IJsonFormatterResolver Instance = new DynamicObjectResolverAllowPrivateTrueExcludeNullTrueNameMutateCamelCase(); private static readonly Func<string, string> nameMutator = StringMutator.ToCamelCase; private static readonly bool excludeNull = true; public IJsonFormatter<T> GetFormatter<T>() { return FormatterCache<T>.formatter; } } internal sealed class DynamicObjectResolverAllowPrivateTrueExcludeNullTrueNameMutateSnakeCase : IJsonFormatterResolver { private static class FormatterCache<T> { public static readonly IJsonFormatter<T> formatter; static FormatterCache() { formatter = (IJsonFormatter<T>)DynamicObjectTypeBuilder.BuildFormatterToDynamicMethod<T>(Instance, nameMutator, excludeNull, allowPrivate: true); } } public static readonly IJsonFormatterResolver Instance = new DynamicObjectResolverAllowPrivateTrueExcludeNullTrueNameMutateSnakeCase(); private static readonly Func<string, string> nameMutator = StringMutator.ToSnakeCase; private static readonly bool excludeNull = true; public IJsonFormatter<T> GetFormatter<T>() { return FormatterCache<T>.formatter; } } internal static class DynamicObjectTypeBuilder { private struct DeserializeInfo { public MetaMember MemberInfo; public LocalBuilder LocalField; public LocalBuilder IsDeserializedField; } internal static class EmitInfo { internal static class JsonWriter { public static readonly MethodInfo GetEncodedPropertyNameWithBeginObject; public static readonly MethodInfo GetEncodedPropertyNameWithPrefixValueSeparator; public static readonly MethodInfo GetEncodedPropertyNameWithoutQuotation; public static readonly MethodInfo GetEncodedPropertyName; public static readonly MethodInfo WriteNull; public static readonly MethodInfo WriteRaw; public static readonly MethodInfo WriteBeginObject; public static readonly MethodInfo WriteEndObject; public static readonly MethodInfo WriteValueSeparator; static JsonWriter() { GetEncodedPropertyNameWithBeginObject = ExpressionUtility.GetMethodInfo(() => Utf8Json.JsonWriter.GetEncodedPropertyNameWithBeginObject(null)); GetEncodedPropertyNameWithPrefixValueSeparator = ExpressionUtility.GetMethodInfo(() => Utf8Json.JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator(null)); GetEncodedPropertyNameWithoutQuotation = ExpressionUtility.GetMethodInfo(() => Utf8Json.JsonWriter
plugins/WebsocketSharp.Core.dll
Decompiled 16 hours ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.IO.Compression; using System.Linq; using System.Net; using System.Net.Security; using System.Net.Sockets; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Security.Authentication; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using System.Security.Permissions; using System.Security.Principal; using System.Text; using System.Threading; using System.Timers; using WebSocketSharp.Net; using WebSocketSharp.Net.WebSockets; using WebSocketSharp.Server; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = "")] [assembly: AssemblyCompany("sta.blockhead")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyCopyright("Copyright © sta.blockhead 2010-2022")] [assembly: AssemblyDescription("A C# implementation of the WebSocket protocol client and server")] [assembly: AssemblyFileVersion("2022.4.16.1520")] [assembly: AssemblyInformationalVersion("2022.04.16.1520")] [assembly: AssemblyProduct("WebsocketSharp.Core - 6799dff1")] [assembly: AssemblyTitle("WebsocketSharp.Core")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/sta/websocket-sharp")] [assembly: AssemblyVersion("2022.4.16.1520")] namespace WebSocketSharp { public enum ByteOrder { Little, Big } public class CloseEventArgs : EventArgs { private bool _clean; private PayloadData _payloadData; public ushort Code => _payloadData.Code; public string Reason => _payloadData.Reason; public bool WasClean => _clean; internal CloseEventArgs(PayloadData payloadData, bool clean) { _payloadData = payloadData; _clean = clean; } internal CloseEventArgs(ushort code, string reason, bool clean) { _payloadData = new PayloadData(code, reason); _clean = clean; } } public enum CloseStatusCode : ushort { Normal = 1000, Away = 1001, ProtocolError = 1002, UnsupportedData = 1003, Undefined = 1004, NoStatus = 1005, Abnormal = 1006, InvalidData = 1007, PolicyViolation = 1008, TooBig = 1009, MandatoryExtension = 1010, ServerError = 1011, TlsHandshakeFailure = 1015 } public enum CompressionMethod : byte { None, Deflate } public class ErrorEventArgs : EventArgs { private Exception _exception; private string _message; public Exception Exception => _exception; public string Message => _message; internal ErrorEventArgs(string message) : this(message, null) { } internal ErrorEventArgs(string message, Exception exception) { _message = message; _exception = exception; } } public static class Ext { private static readonly byte[] _last = new byte[1]; private static readonly int _retry = 5; private const string _tspecials = "()<>@,;:\\\"/[]?={} \t"; private static byte[] compress(this byte[] data) { if (data.LongLength == 0L) { return data; } using MemoryStream stream = new MemoryStream(data); return stream.compressToArray(); } private static MemoryStream compress(this Stream stream) { MemoryStream memoryStream = new MemoryStream(); if (stream.Length == 0L) { return memoryStream; } stream.Position = 0L; using DeflateStream deflateStream = new DeflateStream(memoryStream, CompressionMode.Compress, leaveOpen: true); stream.CopyTo(deflateStream, 1024); deflateStream.Close(); memoryStream.Write(_last, 0, 1); memoryStream.Position = 0L; return memoryStream; } private static byte[] compressToArray(this Stream stream) { using MemoryStream memoryStream = stream.compress(); memoryStream.Close(); return memoryStream.ToArray(); } private static byte[] decompress(this byte[] data) { if (data.LongLength == 0L) { return data; } using MemoryStream stream = new MemoryStream(data); return stream.decompressToArray(); } private static MemoryStream decompress(this Stream stream) { MemoryStream memoryStream = new MemoryStream(); if (stream.Length == 0L) { return memoryStream; } stream.Position = 0L; using DeflateStream deflateStream = new DeflateStream(stream, CompressionMode.Decompress, leaveOpen: true); deflateStream.CopyTo(memoryStream, 1024); memoryStream.Position = 0L; return memoryStream; } private static byte[] decompressToArray(this Stream stream) { using MemoryStream memoryStream = stream.decompress(); memoryStream.Close(); return memoryStream.ToArray(); } private static bool isHttpMethod(this string value) { switch (value) { default: return value == "TRACE"; case "GET": case "HEAD": case "POST": case "PUT": case "DELETE": case "CONNECT": case "OPTIONS": return true; } } private static bool isHttpMethod10(this string value) { if (!(value == "GET") && !(value == "HEAD")) { return value == "POST"; } return true; } private static bool isPredefinedScheme(this string value) { switch (value[0]) { case 'h': if (!(value == "http")) { return value == "https"; } return true; case 'w': if (!(value == "ws")) { return value == "wss"; } return true; case 'f': if (!(value == "file")) { return value == "ftp"; } return true; case 'g': return value == "gopher"; case 'm': return value == "mailto"; case 'n': { char c = value[1]; if (c != 'e') { return value == "nntp"; } if (!(value == "news") && !(value == "net.pipe")) { return value == "net.tcp"; } return true; } default: return false; } } internal static byte[] Append(this ushort code, string reason) { byte[] array = code.InternalToByteArray(ByteOrder.Big); if (reason == null || reason.Length == 0) { return array; } List<byte> list = new List<byte>(array); list.AddRange(Encoding.UTF8.GetBytes(reason)); return list.ToArray(); } internal static byte[] Compress(this byte[] data, CompressionMethod method) { if (method != CompressionMethod.Deflate) { return data; } return data.compress(); } internal static Stream Compress(this Stream stream, CompressionMethod method) { if (method != CompressionMethod.Deflate) { return stream; } return stream.compress(); } internal static byte[] CompressToArray(this Stream stream, CompressionMethod method) { if (method != CompressionMethod.Deflate) { return stream.ToByteArray(); } return stream.compressToArray(); } internal static bool Contains(this string value, params char[] anyOf) { if (anyOf == null || anyOf.Length == 0) { return false; } return value.IndexOfAny(anyOf) > -1; } internal static bool Contains(this NameValueCollection collection, string name) { return collection[name] != null; } internal static bool Contains(this NameValueCollection collection, string name, string value, StringComparison comparisonTypeForValue) { string text = collection[name]; if (text == null) { return false; } string[] array = text.Split(new char[1] { ',' }); for (int i = 0; i < array.Length; i++) { if (array[i].Trim().Equals(value, comparisonTypeForValue)) { return true; } } return false; } internal static bool Contains<T>(this IEnumerable<T> source, Func<T, bool> condition) { foreach (T item in source) { if (condition(item)) { return true; } } return false; } internal static bool ContainsTwice(this string[] values) { int len = values.Length; int end = len - 1; Func<int, bool> seek = null; seek = delegate(int idx) { if (idx == end) { return false; } string text = values[idx]; for (int i = idx + 1; i < len; i++) { if (values[i] == text) { return true; } } return seek(++idx); }; return seek(0); } internal static T[] Copy<T>(this T[] source, int length) { T[] array = new T[length]; Array.Copy(source, 0, array, 0, length); return array; } internal static T[] Copy<T>(this T[] source, long length) { T[] array = new T[length]; Array.Copy(source, 0L, array, 0L, length); return array; } internal static void CopyTo(this Stream source, Stream destination, int bufferLength) { byte[] buffer = new byte[bufferLength]; int num = 0; while (true) { num = source.Read(buffer, 0, bufferLength); if (num > 0) { destination.Write(buffer, 0, num); continue; } break; } } internal static void CopyToAsync(this Stream source, Stream destination, int bufferLength, Action completed, Action<Exception> error) { byte[] buff = new byte[bufferLength]; AsyncCallback callback = null; callback = delegate(IAsyncResult ar) { try { int num = source.EndRead(ar); if (num <= 0) { if (completed != null) { completed(); } } else { destination.Write(buff, 0, num); source.BeginRead(buff, 0, bufferLength, callback, null); } } catch (Exception obj2) { if (error != null) { error(obj2); } } }; try { source.BeginRead(buff, 0, bufferLength, callback, null); } catch (Exception obj) { if (error != null) { error(obj); } } } internal static byte[] Decompress(this byte[] data, CompressionMethod method) { if (method != CompressionMethod.Deflate) { return data; } return data.decompress(); } internal static Stream Decompress(this Stream stream, CompressionMethod method) { if (method != CompressionMethod.Deflate) { return stream; } return stream.decompress(); } internal static byte[] DecompressToArray(this Stream stream, CompressionMethod method) { if (method != CompressionMethod.Deflate) { return stream.ToByteArray(); } return stream.decompressToArray(); } internal static void Emit(this EventHandler eventHandler, object sender, EventArgs e) { eventHandler?.Invoke(sender, e); } internal static void Emit<TEventArgs>(this EventHandler<TEventArgs> eventHandler, object sender, TEventArgs e) where TEventArgs : EventArgs { eventHandler?.Invoke(sender, e); } internal static bool EqualsWith(this int value, char c, Action<int> action) { action(value); return value == c; } internal static string GetAbsolutePath(this Uri uri) { if (uri.IsAbsoluteUri) { return uri.AbsolutePath; } string originalString = uri.OriginalString; if (originalString[0] != '/') { return null; } int num = originalString.IndexOfAny(new char[2] { '?', '#' }); if (num <= 0) { return originalString; } return originalString.Substring(0, num); } internal static WebSocketSharp.Net.CookieCollection GetCookies(this NameValueCollection headers, bool response) { string text = headers[response ? "Set-Cookie" : "Cookie"]; if (text == null) { return new WebSocketSharp.Net.CookieCollection(); } return WebSocketSharp.Net.CookieCollection.Parse(text, response); } internal static string GetDnsSafeHost(this Uri uri, bool bracketIPv6) { if (!bracketIPv6 || uri.HostNameType != UriHostNameType.IPv6) { return uri.DnsSafeHost; } return uri.Host; } internal static string GetMessage(this CloseStatusCode code) { return code switch { CloseStatusCode.TlsHandshakeFailure => "An error has occurred during a TLS handshake.", CloseStatusCode.ServerError => "WebSocket server got an internal error.", CloseStatusCode.MandatoryExtension => "WebSocket client didn't receive expected extension(s).", CloseStatusCode.TooBig => "A too big message has been received.", CloseStatusCode.PolicyViolation => "A policy violation has occurred.", CloseStatusCode.InvalidData => "Invalid data has been received.", CloseStatusCode.Abnormal => "An exception has occurred.", CloseStatusCode.UnsupportedData => "Unsupported data has been received.", CloseStatusCode.ProtocolError => "A WebSocket protocol error has occurred.", _ => string.Empty, }; } internal static string GetName(this string nameAndValue, char separator) { int num = nameAndValue.IndexOf(separator); if (num <= 0) { return null; } return nameAndValue.Substring(0, num).Trim(); } internal static string GetUTF8DecodedString(this byte[] bytes) { return Encoding.UTF8.GetString(bytes); } internal static byte[] GetUTF8EncodedBytes(this string s) { return Encoding.UTF8.GetBytes(s); } internal static string GetValue(this string nameAndValue, char separator) { return nameAndValue.GetValue(separator, unquote: false); } internal static string GetValue(this string nameAndValue, char separator, bool unquote) { int num = nameAndValue.IndexOf(separator); if (num < 0 || num == nameAndValue.Length - 1) { return null; } string text = nameAndValue.Substring(num + 1).Trim(); if (!unquote) { return text; } return text.Unquote(); } internal static byte[] InternalToByteArray(this ushort value, ByteOrder order) { byte[] bytes = BitConverter.GetBytes(value); if (!order.IsHostOrder()) { Array.Reverse((Array)bytes); } return bytes; } internal static byte[] InternalToByteArray(this ulong value, ByteOrder order) { byte[] bytes = BitConverter.GetBytes(value); if (!order.IsHostOrder()) { Array.Reverse((Array)bytes); } return bytes; } internal static bool IsCompressionExtension(this string value, CompressionMethod method) { return value.StartsWith(method.ToExtensionString()); } internal static bool IsControl(this byte opcode) { if (opcode > 7) { return opcode < 16; } return false; } internal static bool IsControl(this Opcode opcode) { return (int)opcode >= 8; } internal static bool IsData(this byte opcode) { if (opcode != 1) { return opcode == 2; } return true; } internal static bool IsData(this Opcode opcode) { if (opcode != Opcode.Text) { return opcode == Opcode.Binary; } return true; } internal static bool IsHttpMethod(this string value, Version version) { if (!(version == WebSocketSharp.Net.HttpVersion.Version10)) { return value.isHttpMethod(); } return value.isHttpMethod10(); } internal static bool IsPortNumber(this int value) { if (value > 0) { return value < 65536; } return false; } internal static bool IsReserved(this ushort code) { if (code != 1004 && code != 1005 && code != 1006) { return code == 1015; } return true; } internal static bool IsReserved(this CloseStatusCode code) { if (code != CloseStatusCode.Undefined && code != CloseStatusCode.NoStatus && code != CloseStatusCode.Abnormal) { return code == CloseStatusCode.TlsHandshakeFailure; } return true; } internal static bool IsSupported(this byte opcode) { return Enum.IsDefined(typeof(Opcode), opcode); } internal static bool IsText(this string value) { int length = value.Length; for (int i = 0; i < length; i++) { char c = value[i]; if (c < ' ') { if ("\r\n\t".IndexOf(c) == -1) { return false; } if (c == '\n') { i++; if (i == length) { break; } c = value[i]; if (" \t".IndexOf(c) == -1) { return false; } } } else if (c == '\u007f') { return false; } } return true; } internal static bool IsToken(this string value) { foreach (char c in value) { if (c < ' ') { return false; } if (c > '~') { return false; } if ("()<>@,;:\\\"/[]?={} \t".IndexOf(c) > -1) { return false; } } return true; } internal static bool KeepsAlive(this NameValueCollection headers, Version version) { StringComparison comparisonTypeForValue = StringComparison.OrdinalIgnoreCase; if (!(version < WebSocketSharp.Net.HttpVersion.Version11)) { return !headers.Contains("Connection", "close", comparisonTypeForValue); } return headers.Contains("Connection", "keep-alive", comparisonTypeForValue); } internal static bool MaybeUri(this string value) { int num = value.IndexOf(':'); if (num < 2 || num > 9) { return false; } return value.Substring(0, num).isPredefinedScheme(); } internal static string Quote(this string value) { return string.Format("\"{0}\"", value.Replace("\"", "\\\"")); } internal static byte[] ReadBytes(this Stream stream, int length) { byte[] array = new byte[length]; int num = 0; int num2 = 0; int num3 = 0; while (length > 0) { num3 = stream.Read(array, num, length); if (num3 <= 0) { if (num2 >= _retry) { return array.SubArray(0, num); } num2++; } else { num2 = 0; num += num3; length -= num3; } } return array; } internal static byte[] ReadBytes(this Stream stream, long length, int bufferLength) { using MemoryStream memoryStream = new MemoryStream(); byte[] buffer = new byte[bufferLength]; int num = 0; int num2 = 0; while (length > 0) { if (length < bufferLength) { bufferLength = (int)length; } num2 = stream.Read(buffer, 0, bufferLength); if (num2 <= 0) { if (num >= _retry) { break; } num++; } else { num = 0; memoryStream.Write(buffer, 0, num2); length -= num2; } } memoryStream.Close(); return memoryStream.ToArray(); } internal static void ReadBytesAsync(this Stream stream, int length, Action<byte[]> completed, Action<Exception> error) { byte[] buff = new byte[length]; int offset = 0; int retry = 0; AsyncCallback callback = null; callback = delegate(IAsyncResult ar) { try { int num = stream.EndRead(ar); if (num <= 0) { if (retry < _retry) { retry++; stream.BeginRead(buff, offset, length, callback, null); } else if (completed != null) { completed(buff.SubArray(0, offset)); } } else if (num == length) { if (completed != null) { completed(buff); } } else { retry = 0; offset += num; length -= num; stream.BeginRead(buff, offset, length, callback, null); } } catch (Exception obj2) { if (error != null) { error(obj2); } } }; try { stream.BeginRead(buff, offset, length, callback, null); } catch (Exception obj) { if (error != null) { error(obj); } } } internal static void ReadBytesAsync(this Stream stream, long length, int bufferLength, Action<byte[]> completed, Action<Exception> error) { MemoryStream dest = new MemoryStream(); byte[] buff = new byte[bufferLength]; int retry = 0; Action<long> read = null; read = delegate(long len) { if (len < bufferLength) { bufferLength = (int)len; } stream.BeginRead(buff, 0, bufferLength, delegate(IAsyncResult ar) { try { int num = stream.EndRead(ar); if (num <= 0) { if (retry < _retry) { int num2 = retry; retry = num2 + 1; read(len); } else { if (completed != null) { dest.Close(); completed(dest.ToArray()); } dest.Dispose(); } } else { dest.Write(buff, 0, num); if (num == len) { if (completed != null) { dest.Close(); completed(dest.ToArray()); } dest.Dispose(); } else { retry = 0; read(len - num); } } } catch (Exception obj2) { dest.Dispose(); if (error != null) { error(obj2); } } }, null); }; try { read(length); } catch (Exception obj) { dest.Dispose(); if (error != null) { error(obj); } } } internal static T[] Reverse<T>(this T[] array) { int num = array.Length; T[] array2 = new T[num]; int num2 = num - 1; for (int i = 0; i <= num2; i++) { array2[i] = array[num2 - i]; } return array2; } internal static IEnumerable<string> SplitHeaderValue(this string value, params char[] separators) { int length = value.Length; int end = length - 1; StringBuilder buff = new StringBuilder(32); bool escaped = false; bool quoted = false; for (int i = 0; i <= end; i++) { char c = value[i]; buff.Append(c); switch (c) { case '"': if (escaped) { escaped = false; } else { quoted = !quoted; } continue; case '\\': if (i != end) { if (value[i + 1] == '"') { escaped = true; } continue; } break; default: if (Array.IndexOf(separators, c) > -1 && !quoted) { buff.Length--; yield return buff.ToString(); buff.Length = 0; } continue; } break; } yield return buff.ToString(); } internal static byte[] ToByteArray(this Stream stream) { using MemoryStream memoryStream = new MemoryStream(); stream.Position = 0L; stream.CopyTo(memoryStream, 1024); memoryStream.Close(); return memoryStream.ToArray(); } internal static CompressionMethod ToCompressionMethod(this string value) { foreach (CompressionMethod value2 in Enum.GetValues(typeof(CompressionMethod))) { if (value2.ToExtensionString() == value) { return value2; } } return CompressionMethod.None; } internal static string ToExtensionString(this CompressionMethod method, params string[] parameters) { if (method == CompressionMethod.None) { return string.Empty; } string text = $"permessage-{method.ToString().ToLower()}"; if (parameters == null || parameters.Length == 0) { return text; } return string.Format("{0}; {1}", text, parameters.ToString("; ")); } internal static IPAddress ToIPAddress(this string value) { if (value == null || value.Length == 0) { return null; } if (IPAddress.TryParse(value, out IPAddress address)) { return address; } try { return Dns.GetHostAddresses(value)[0]; } catch { return null; } } internal static List<TSource> ToList<TSource>(this IEnumerable<TSource> source) { return new List<TSource>(source); } internal static string ToString(this IPAddress address, bool bracketIPv6) { if (!bracketIPv6 || address.AddressFamily != AddressFamily.InterNetworkV6) { return address.ToString(); } return $"[{address.ToString()}]"; } internal static ushort ToUInt16(this byte[] source, ByteOrder sourceOrder) { return BitConverter.ToUInt16(source.ToHostOrder(sourceOrder), 0); } internal static ulong ToUInt64(this byte[] source, ByteOrder sourceOrder) { return BitConverter.ToUInt64(source.ToHostOrder(sourceOrder), 0); } internal static IEnumerable<string> TrimEach(this IEnumerable<string> source) { foreach (string item in source) { yield return item.Trim(); } } internal static string TrimSlashFromEnd(this string value) { string text = value.TrimEnd(new char[1] { '/' }); if (text.Length <= 0) { return "/"; } return text; } internal static string TrimSlashOrBackslashFromEnd(this string value) { string text = value.TrimEnd('/', '\\'); if (text.Length <= 0) { return value[0].ToString(); } return text; } internal static bool TryCreateVersion(this string versionString, out Version result) { result = null; try { result = new Version(versionString); } catch { return false; } return true; } internal static bool TryCreateWebSocketUri(this string uriString, out Uri result, out string message) { result = null; message = null; Uri uri = uriString.ToUri(); if (uri == null) { message = "An invalid URI string."; return false; } if (!uri.IsAbsoluteUri) { message = "A relative URI."; return false; } string scheme = uri.Scheme; if (!(scheme == "ws") && !(scheme == "wss")) { message = "The scheme part is not 'ws' or 'wss'."; return false; } int port = uri.Port; if (port == 0) { message = "The port part is zero."; return false; } if (uri.Fragment.Length > 0) { message = "It includes the fragment component."; return false; } result = ((port != -1) ? uri : new Uri(string.Format("{0}://{1}:{2}{3}", scheme, uri.Host, (scheme == "ws") ? 80 : 443, uri.PathAndQuery))); return true; } internal static bool TryGetUTF8DecodedString(this byte[] bytes, out string s) { s = null; try { s = Encoding.UTF8.GetString(bytes); } catch { return false; } return true; } internal static bool TryGetUTF8EncodedBytes(this string s, out byte[] bytes) { bytes = null; try { bytes = Encoding.UTF8.GetBytes(s); } catch { return false; } return true; } internal static bool TryOpenRead(this FileInfo fileInfo, out FileStream fileStream) { fileStream = null; try { fileStream = fileInfo.OpenRead(); } catch { return false; } return true; } internal static string Unquote(this string value) { int num = value.IndexOf('"'); if (num == -1) { return value; } int num2 = value.LastIndexOf('"'); if (num2 == num) { return value; } int num3 = num2 - num - 1; if (num3 <= 0) { return string.Empty; } return value.Substring(num + 1, num3).Replace("\\\"", "\""); } internal static bool Upgrades(this NameValueCollection headers, string protocol) { StringComparison comparisonTypeForValue = StringComparison.OrdinalIgnoreCase; if (headers.Contains("Upgrade", protocol, comparisonTypeForValue)) { return headers.Contains("Connection", "Upgrade", comparisonTypeForValue); } return false; } internal static string UrlDecode(this string value, Encoding encoding) { return HttpUtility.UrlDecode(value, encoding); } internal static string UrlEncode(this string value, Encoding encoding) { return HttpUtility.UrlEncode(value, encoding); } internal static void WriteBytes(this Stream stream, byte[] bytes, int bufferLength) { using MemoryStream memoryStream = new MemoryStream(bytes); memoryStream.CopyTo(stream, bufferLength); } internal static void WriteBytesAsync(this Stream stream, byte[] bytes, int bufferLength, Action completed, Action<Exception> error) { MemoryStream src = new MemoryStream(bytes); src.CopyToAsync(stream, bufferLength, delegate { if (completed != null) { completed(); } src.Dispose(); }, delegate(Exception ex) { src.Dispose(); if (error != null) { error(ex); } }); } public static string GetDescription(this WebSocketSharp.Net.HttpStatusCode code) { return ((int)code).GetStatusDescription(); } public static string GetStatusDescription(this int code) { return code switch { 100 => "Continue", 101 => "Switching Protocols", 102 => "Processing", 200 => "OK", 201 => "Created", 202 => "Accepted", 203 => "Non-Authoritative Information", 204 => "No Content", 205 => "Reset Content", 206 => "Partial Content", 207 => "Multi-Status", 300 => "Multiple Choices", 301 => "Moved Permanently", 302 => "Found", 303 => "See Other", 304 => "Not Modified", 305 => "Use Proxy", 307 => "Temporary Redirect", 400 => "Bad Request", 401 => "Unauthorized", 402 => "Payment Required", 403 => "Forbidden", 404 => "Not Found", 405 => "Method Not Allowed", 406 => "Not Acceptable", 407 => "Proxy Authentication Required", 408 => "Request Timeout", 409 => "Conflict", 410 => "Gone", 411 => "Length Required", 412 => "Precondition Failed", 413 => "Request Entity Too Large", 414 => "Request-Uri Too Long", 415 => "Unsupported Media Type", 416 => "Requested Range Not Satisfiable", 417 => "Expectation Failed", 422 => "Unprocessable Entity", 423 => "Locked", 424 => "Failed Dependency", 500 => "Internal Server Error", 501 => "Not Implemented", 502 => "Bad Gateway", 503 => "Service Unavailable", 504 => "Gateway Timeout", 505 => "Http Version Not Supported", 507 => "Insufficient Storage", _ => string.Empty, }; } public static bool IsCloseStatusCode(this ushort value) { if (value > 999) { return value < 5000; } return false; } public static bool IsEnclosedIn(this string value, char c) { if (value == null) { return false; } int length = value.Length; if (length <= 1) { return false; } if (value[0] == c) { return value[length - 1] == c; } return false; } public static bool IsHostOrder(this ByteOrder order) { return BitConverter.IsLittleEndian == (order == ByteOrder.Little); } public static bool IsLocal(this IPAddress address) { if (address == null) { throw new ArgumentNullException("address"); } if (address.Equals(IPAddress.Any)) { return true; } if (address.Equals(IPAddress.Loopback)) { return true; } if (Socket.OSSupportsIPv6) { if (address.Equals(IPAddress.IPv6Any)) { return true; } if (address.Equals(IPAddress.IPv6Loopback)) { return true; } } IPAddress[] hostAddresses = Dns.GetHostAddresses(Dns.GetHostName()); foreach (IPAddress obj in hostAddresses) { if (address.Equals(obj)) { return true; } } return false; } public static bool IsNullOrEmpty(this string value) { if (value != null) { return value.Length == 0; } return true; } public static T[] SubArray<T>(this T[] array, int startIndex, int length) { if (array == null) { throw new ArgumentNullException("array"); } int num = array.Length; if (num == 0) { if (startIndex != 0) { throw new ArgumentOutOfRangeException("startIndex"); } if (length != 0) { throw new ArgumentOutOfRangeException("length"); } return array; } if (startIndex < 0 || startIndex >= num) { throw new ArgumentOutOfRangeException("startIndex"); } if (length < 0 || length > num - startIndex) { throw new ArgumentOutOfRangeException("length"); } if (length == 0) { return new T[0]; } if (length == num) { return array; } T[] array2 = new T[length]; Array.Copy(array, startIndex, array2, 0, length); return array2; } public static T[] SubArray<T>(this T[] array, long startIndex, long length) { if (array == null) { throw new ArgumentNullException("array"); } long num = array.LongLength; if (num == 0L) { if (startIndex != 0L) { throw new ArgumentOutOfRangeException("startIndex"); } if (length != 0L) { throw new ArgumentOutOfRangeException("length"); } return array; } if (startIndex < 0 || startIndex >= num) { throw new ArgumentOutOfRangeException("startIndex"); } if (length < 0 || length > num - startIndex) { throw new ArgumentOutOfRangeException("length"); } if (length == 0L) { return new T[0]; } if (length == num) { return array; } T[] array2 = new T[length]; Array.Copy(array, startIndex, array2, 0L, length); return array2; } public static void Times(this int n, Action<int> action) { if (n > 0 && action != null) { for (int i = 0; i < n; i++) { action(i); } } } public static void Times(this long n, Action<long> action) { if (n > 0 && action != null) { for (long num = 0L; num < n; num++) { action(num); } } } public static byte[] ToHostOrder(this byte[] source, ByteOrder sourceOrder) { if (source == null) { throw new ArgumentNullException("source"); } if (source.Length < 2) { return source; } if (sourceOrder.IsHostOrder()) { return source; } return source.Reverse(); } public static string ToString<T>(this T[] array, string separator) { if (array == null) { throw new ArgumentNullException("array"); } int num = array.Length; if (num == 0) { return string.Empty; } StringBuilder stringBuilder = new StringBuilder(64); int num2 = num - 1; for (int i = 0; i < num2; i++) { stringBuilder.AppendFormat("{0}{1}", array[i], separator); } stringBuilder.AppendFormat("{0}", array[num2]); return stringBuilder.ToString(); } public static Uri ToUri(this string value) { if (value == null || value.Length == 0) { return null; } UriKind uriKind = (value.MaybeUri() ? UriKind.Absolute : UriKind.Relative); Uri.TryCreate(value, uriKind, out Uri result); return result; } } internal enum Fin : byte { More, Final } internal abstract class HttpBase { private NameValueCollection _headers; private const int _headersMaxLength = 8192; private Version _version; internal byte[] EntityBodyData; protected const string CrLf = "\r\n"; public string EntityBody { get { if (EntityBodyData == null || EntityBodyData.LongLength == 0L) { return string.Empty; } Encoding encoding = null; string text = _headers["Content-Type"]; if (text != null && text.Length > 0) { encoding = HttpUtility.GetEncoding(text); } return (encoding ?? Encoding.UTF8).GetString(EntityBodyData); } } public NameValueCollection Headers => _headers; public Version ProtocolVersion => _version; protected HttpBase(Version version, NameValueCollection headers) { _version = version; _headers = headers; } private static byte[] readEntityBody(Stream stream, string length) { if (!long.TryParse(length, out var result)) { throw new ArgumentException("Cannot be parsed.", "length"); } if (result < 0) { throw new ArgumentOutOfRangeException("length", "Less than zero."); } if (result <= 1024) { if (result <= 0) { return null; } return stream.ReadBytes((int)result); } return stream.ReadBytes(result, 1024); } private static string[] readHeaders(Stream stream, int maxLength) { List<byte> buff = new List<byte>(); int cnt = 0; Action<int> action = delegate(int i) { if (i == -1) { throw new EndOfStreamException("The header cannot be read from the data source."); } buff.Add((byte)i); cnt++; }; bool flag = false; while (cnt < maxLength) { if (stream.ReadByte().EqualsWith('\r', action) && stream.ReadByte().EqualsWith('\n', action) && stream.ReadByte().EqualsWith('\r', action) && stream.ReadByte().EqualsWith('\n', action)) { flag = true; break; } } if (!flag) { throw new WebSocketException("The length of header part is greater than the max length."); } return Encoding.UTF8.GetString(buff.ToArray()).Replace("\r\n ", " ").Replace("\r\n\t", " ") .Split(new string[1] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); } protected static T Read<T>(Stream stream, Func<string[], T> parser, int millisecondsTimeout) where T : HttpBase { bool timeout = false; System.Threading.Timer timer = new System.Threading.Timer(delegate { timeout = true; stream.Close(); }, null, millisecondsTimeout, -1); T val = null; Exception ex = null; try { val = parser(readHeaders(stream, 8192)); string text = val.Headers["Content-Length"]; if (text != null && text.Length > 0) { val.EntityBodyData = readEntityBody(stream, text); } } catch (Exception ex2) { ex = ex2; } finally { timer.Change(-1, -1); timer.Dispose(); } string text2 = (timeout ? "A timeout has occurred while reading an HTTP request/response." : ((ex != null) ? "An exception has occurred while reading an HTTP request/response." : null)); if (text2 != null) { throw new WebSocketException(text2, ex); } return val; } public byte[] ToByteArray() { return Encoding.UTF8.GetBytes(ToString()); } } internal class HttpRequest : HttpBase { private WebSocketSharp.Net.CookieCollection _cookies; private string _method; private string _uri; public AuthenticationResponse AuthenticationResponse { get { string text = base.Headers["Authorization"]; if (text == null || text.Length <= 0) { return null; } return AuthenticationResponse.Parse(text); } } public WebSocketSharp.Net.CookieCollection Cookies { get { if (_cookies == null) { _cookies = base.Headers.GetCookies(response: false); } return _cookies; } } public string HttpMethod => _method; public bool IsWebSocketRequest { get { if (_method == "GET" && base.ProtocolVersion > WebSocketSharp.Net.HttpVersion.Version10) { return base.Headers.Upgrades("websocket"); } return false; } } public string RequestUri => _uri; private HttpRequest(string method, string uri, Version version, NameValueCollection headers) : base(version, headers) { _method = method; _uri = uri; } internal HttpRequest(string method, string uri) : this(method, uri, WebSocketSharp.Net.HttpVersion.Version11, new NameValueCollection()) { base.Headers["User-Agent"] = WebSocket.Header_UserAgent; } internal static HttpRequest CreateConnectRequest(Uri uri) { string dnsSafeHost = uri.DnsSafeHost; int port = uri.Port; string text = $"{dnsSafeHost}:{port}"; HttpRequest httpRequest = new HttpRequest("CONNECT", text); httpRequest.Headers["Host"] = ((port == 80) ? dnsSafeHost : text); return httpRequest; } internal static HttpRequest CreateWebSocketRequest(Uri uri) { HttpRequest httpRequest = new HttpRequest("GET", uri.PathAndQuery); NameValueCollection headers = httpRequest.Headers; int port = uri.Port; string scheme = uri.Scheme; headers["Host"] = (((port == 80 && scheme == "ws") || (port == 443 && scheme == "wss")) ? uri.DnsSafeHost : uri.Authority); headers["Upgrade"] = "websocket"; headers["Connection"] = "Upgrade"; return httpRequest; } internal HttpResponse GetResponse(Stream stream, int millisecondsTimeout) { byte[] array = ToByteArray(); stream.Write(array, 0, array.Length); return HttpBase.Read(stream, HttpResponse.Parse, millisecondsTimeout); } internal static HttpRequest Parse(string[] headerParts) { string[] array = headerParts[0].Split(new char[1] { ' ' }, 3); if (array.Length != 3) { throw new ArgumentException("Invalid request line: " + headerParts[0]); } WebSocketSharp.Net.WebHeaderCollection webHeaderCollection = new WebSocketSharp.Net.WebHeaderCollection(); for (int i = 1; i < headerParts.Length; i++) { webHeaderCollection.InternalSet(headerParts[i], response: false); } return new HttpRequest(array[0], array[1], new Version(array[2].Substring(5)), webHeaderCollection); } internal static HttpRequest Read(Stream stream, int millisecondsTimeout) { return HttpBase.Read(stream, Parse, millisecondsTimeout); } public void SetCookies(WebSocketSharp.Net.CookieCollection cookies) { if (cookies == null || cookies.Count == 0) { return; } StringBuilder stringBuilder = new StringBuilder(64); foreach (WebSocketSharp.Net.Cookie item in cookies.Sorted) { if (!item.Expired) { stringBuilder.AppendFormat("{0}; ", item.ToString()); } } int length = stringBuilder.Length; if (length > 2) { stringBuilder.Length = length - 2; base.Headers["Cookie"] = stringBuilder.ToString(); } } public override string ToString() { StringBuilder stringBuilder = new StringBuilder(64); stringBuilder.AppendFormat("{0} {1} HTTP/{2}{3}", _method, _uri, base.ProtocolVersion, "\r\n"); NameValueCollection headers = base.Headers; string[] allKeys = headers.AllKeys; foreach (string text in allKeys) { stringBuilder.AppendFormat("{0}: {1}{2}", text, headers[text], "\r\n"); } stringBuilder.Append("\r\n"); string entityBody = base.EntityBody; if (entityBody.Length > 0) { stringBuilder.Append(entityBody); } return stringBuilder.ToString(); } } internal class HttpResponse : HttpBase { private string _code; private string _reason; public WebSocketSharp.Net.CookieCollection Cookies => base.Headers.GetCookies(response: true); public bool HasConnectionClose { get { StringComparison comparisonTypeForValue = StringComparison.OrdinalIgnoreCase; return base.Headers.Contains("Connection", "close", comparisonTypeForValue); } } public bool IsProxyAuthenticationRequired => _code == "407"; public bool IsRedirect { get { if (!(_code == "301")) { return _code == "302"; } return true; } } public bool IsUnauthorized => _code == "401"; public bool IsWebSocketResponse { get { if (base.ProtocolVersion > WebSocketSharp.Net.HttpVersion.Version10 && _code == "101") { return base.Headers.Upgrades("websocket"); } return false; } } public string Reason => _reason; public string StatusCode => _code; private HttpResponse(string code, string reason, Version version, NameValueCollection headers) : base(version, headers) { _code = code; _reason = reason; } internal HttpResponse(WebSocketSharp.Net.HttpStatusCode code) : this(code, code.GetDescription()) { } internal HttpResponse(WebSocketSharp.Net.HttpStatusCode code, string reason) : this(((int)code).ToString(), reason, WebSocketSharp.Net.HttpVersion.Version11, new NameValueCollection()) { base.Headers["Server"] = WebSocketServer.Headers_Server; } internal static HttpResponse CreateCloseResponse(WebSocketSharp.Net.HttpStatusCode code) { HttpResponse httpResponse = new HttpResponse(code); httpResponse.Headers["Connection"] = "close"; return httpResponse; } internal static HttpResponse CreateUnauthorizedResponse(string challenge) { HttpResponse httpResponse = new HttpResponse(WebSocketSharp.Net.HttpStatusCode.Unauthorized); httpResponse.Headers["WWW-Authenticate"] = challenge; return httpResponse; } internal static HttpResponse CreateWebSocketResponse() { HttpResponse httpResponse = new HttpResponse(WebSocketSharp.Net.HttpStatusCode.SwitchingProtocols); NameValueCollection headers = httpResponse.Headers; headers["Upgrade"] = "websocket"; headers["Connection"] = "Upgrade"; return httpResponse; } internal static HttpResponse Parse(string[] headerParts) { string[] array = headerParts[0].Split(new char[1] { ' ' }, 3); if (array.Length != 3) { throw new ArgumentException("Invalid status line: " + headerParts[0]); } WebSocketSharp.Net.WebHeaderCollection webHeaderCollection = new WebSocketSharp.Net.WebHeaderCollection(); for (int i = 1; i < headerParts.Length; i++) { webHeaderCollection.InternalSet(headerParts[i], response: true); } return new HttpResponse(array[1], array[2], new Version(array[0].Substring(5)), webHeaderCollection); } internal static HttpResponse Read(Stream stream, int millisecondsTimeout) { return HttpBase.Read(stream, Parse, millisecondsTimeout); } public void SetCookies(WebSocketSharp.Net.CookieCollection cookies) { if (cookies == null || cookies.Count == 0) { return; } NameValueCollection headers = base.Headers; foreach (WebSocketSharp.Net.Cookie item in cookies.Sorted) { headers.Add("Set-Cookie", item.ToResponseString()); } } public override string ToString() { StringBuilder stringBuilder = new StringBuilder(64); stringBuilder.AppendFormat("HTTP/{0} {1} {2}{3}", base.ProtocolVersion, _code, _reason, "\r\n"); NameValueCollection headers = base.Headers; string[] allKeys = headers.AllKeys; foreach (string text in allKeys) { stringBuilder.AppendFormat("{0}: {1}{2}", text, headers[text], "\r\n"); } stringBuilder.Append("\r\n"); string entityBody = base.EntityBody; if (entityBody.Length > 0) { stringBuilder.Append(entityBody); } return stringBuilder.ToString(); } } public class LogData { private StackFrame _caller; private DateTime _date; private LogLevel _level; private string _message; public StackFrame Caller => _caller; public DateTime Date => _date; public LogLevel Level => _level; public string Message => _message; internal LogData(LogLevel level, StackFrame caller, string message) { _level = level; _caller = caller; _message = message ?? string.Empty; _date = DateTime.Now; } public override string ToString() { string text = $"{_date}|{_level,-5}|"; MethodBase method = _caller.GetMethod(); Type declaringType = method.DeclaringType; string arg = $"{text}{declaringType.Name}.{method.Name}|"; string[] array = _message.Replace("\r\n", "\n").TrimEnd(new char[1] { '\n' }).Split(new char[1] { '\n' }); if (array.Length <= 1) { return $"{arg}{_message}"; } StringBuilder stringBuilder = new StringBuilder($"{arg}{array[0]}\n", 64); string format = $"{{0,{text.Length}}}{{1}}\n"; for (int i = 1; i < array.Length; i++) { stringBuilder.AppendFormat(format, "", array[i]); } stringBuilder.Length--; return stringBuilder.ToString(); } } public class Logger { private volatile string _file; private volatile LogLevel _level; private Action<LogData, string> _output; private object _sync; public string File { get { return _file; } set { lock (_sync) { _file = value; Warn($"The current path to the log file has been changed to {_file}."); } } } public LogLevel Level { get { return _level; } set { lock (_sync) { _level = value; Warn($"The current logging level has been changed to {_level}."); } } } public Action<LogData, string> Output { get { return _output; } set { lock (_sync) { _output = value ?? new Action<LogData, string>(defaultOutput); Warn("The current output action has been changed."); } } } public Logger() : this(LogLevel.None, null, null) { } public Logger(LogLevel level) : this(level, null, null) { } public Logger(LogLevel level, string file, Action<LogData, string> output) { _level = level; _file = file; _output = output ?? new Action<LogData, string>(defaultOutput); _sync = new object(); } private static void defaultOutput(LogData data, string path) { string value = data.ToString(); Console.WriteLine(value); if (path != null && path.Length > 0) { writeToFile(value, path); } } private void output(string message, LogLevel level) { lock (_sync) { if (_level > level) { return; } LogData logData = null; try { logData = new LogData(level, new StackFrame(2, needFileInfo: true), message); _output(logData, _file); } catch (Exception ex) { logData = new LogData(LogLevel.Fatal, new StackFrame(0, needFileInfo: true), ex.Message); Console.WriteLine(logData.ToString()); } } } private static void writeToFile(string value, string path) { using StreamWriter writer = new StreamWriter(path, append: true); using TextWriter textWriter = TextWriter.Synchronized(writer); textWriter.WriteLine(value); } public void Debug(string message) { if (_level <= LogLevel.Debug) { output(message, LogLevel.Debug); } } public void Error(string message) { if (_level <= LogLevel.Error) { output(message, LogLevel.Error); } } public void Fatal(string message) { output(message, LogLevel.Fatal); } public void Info(string message) { if (_level <= LogLevel.Info) { output(message, LogLevel.Info); } } public void Trace(string message) { if (_level <= LogLevel.Trace) { output(message, LogLevel.Trace); } } public void Warn(string message) { if (_level <= LogLevel.Warn) { output(message, LogLevel.Warn); } } } public enum LogLevel { Trace = 0, Debug = 1, Info = 2, Warn = 3, Error = 4, Fatal = 5, None = int.MaxValue } internal enum Mask : byte { Off, On } public class MessageEventArgs : EventArgs { private string _data; private bool _dataSet; private Opcode _opcode; private byte[] _rawData; internal Opcode Opcode => _opcode; public string Data { get { setData(); return _data; } } public bool IsBinary => _opcode == Opcode.Binary; public bool IsPing => _opcode == Opcode.Ping; public bool IsText => _opcode == Opcode.Text; public byte[] RawData { get { setData(); return _rawData; } } internal MessageEventArgs(WebSocketFrame frame) { _opcode = frame.Opcode; _rawData = frame.PayloadData.ApplicationData; } internal MessageEventArgs(Opcode opcode, byte[] rawData) { if ((ulong)rawData.LongLength > PayloadData.MaxLength) { throw new WebSocketException(CloseStatusCode.TooBig); } _opcode = opcode; _rawData = rawData; } private void setData() { if (_dataSet) { return; } if (_opcode == Opcode.Binary) { _dataSet = true; return; } if (_rawData.TryGetUTF8DecodedString(out var s)) { _data = s; } _dataSet = true; } } internal enum Opcode : byte { Cont = 0, Text = 1, Binary = 2, Close = 8, Ping = 9, Pong = 10 } internal class PayloadData : IEnumerable<byte>, IEnumerable { private byte[] _data; private long _extDataLength; private long _length; public static readonly PayloadData Empty; public static readonly ulong MaxLength; internal ushort Code { get { if (_length < 2) { return 1005; } return _data.SubArray(0, 2).ToUInt16(ByteOrder.Big); } } internal long ExtensionDataLength { get { return _extDataLength; } set { _extDataLength = value; } } internal bool HasReservedCode { get { if (_length >= 2) { return Code.IsReserved(); } return false; } } internal string Reason { get { if (_length <= 2) { return string.Empty; } if (!_data.SubArray(2L, _length - 2).TryGetUTF8DecodedString(out var s)) { return string.Empty; } return s; } } public byte[] ApplicationData { get { if (_extDataLength <= 0) { return _data; } return _data.SubArray(_extDataLength, _length - _extDataLength); } } public byte[] ExtensionData { get { if (_extDataLength <= 0) { return WebSocket.EmptyBytes; } return _data.SubArray(0L, _extDataLength); } } public ulong Length => (ulong)_length; static PayloadData() { Empty = new PayloadData(WebSocket.EmptyBytes, 0L); MaxLength = 9223372036854775807uL; } internal PayloadData(byte[] data) : this(data, data.LongLength) { } internal PayloadData(byte[] data, long length) { _data = data; _length = length; } internal PayloadData(ushort code, string reason) { _data = code.Append(reason); _length = _data.LongLength; } internal void Mask(byte[] key) { for (long num = 0L; num < _length; num++) { _data[num] ^= key[num % 4]; } } public IEnumerator<byte> GetEnumerator() { byte[] data = _data; for (int i = 0; i < data.Length; i++) { yield return data[i]; } } public byte[] ToArray() { return _data; } public override string ToString() { return BitConverter.ToString(_data); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } internal enum Rsv : byte { Off, On } public class WebSocket : IDisposable { private AuthenticationChallenge _authChallenge; private string _base64Key; private bool _client; private Action _closeContext; private CompressionMethod _compression; private WebSocketContext _context; private WebSocketSharp.Net.CookieCollection _cookies; private WebSocketSharp.Net.NetworkCredential _credentials; private bool _emitOnPing; private bool _enableRedirection; private string _extensions; private bool _extensionsRequested; private object _forMessageEventQueue; private object _forPing; private object _forSend; private object _forState; private MemoryStream _fragmentsBuffer; private bool _fragmentsCompressed; private Opcode _fragmentsOpcode; private const string _guid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; private Func<WebSocketContext, string> _handshakeRequestChecker; private bool _ignoreExtensions; private bool _inContinuation; private volatile bool _inMessage; private volatile Logger _logger; private static readonly int _maxRetryCountForConnect; private Action<MessageEventArgs> _message; private Queue<MessageEventArgs> _messageEventQueue; private uint _nonceCount; private string _origin; private ManualResetEvent _pongReceived; private bool _preAuth; private string _protocol; private string[] _protocols; private bool _protocolsRequested; private WebSocketSharp.Net.NetworkCredential _proxyCredentials; private Uri _proxyUri; private volatile WebSocketState _readyState; private ManualResetEvent _receivingExited; private int _retryCountForConnect; private bool _secure; private ClientSslConfiguration _sslConfig; private Stream _stream; private TcpClient _tcpClient; private Uri _uri; private const string _version = "13"; private TimeSpan _waitTime; internal static readonly byte[] EmptyBytes; internal static readonly int FragmentLength; internal static readonly RandomNumberGenerator RandomNumber; private static string _header_UserAgent; private NameValueCollection _userHeaders = new NameValueCollection(); internal WebSocketSharp.Net.CookieCollection CookieCollection => _cookies; internal Func<WebSocketContext, string> CustomHandshakeRequestChecker { get { return _handshakeRequestChecker; } set { _handshakeRequestChecker = value; } } internal bool HasMessage { get { lock (_forMessageEventQueue) { return _messageEventQueue.Count > 0; } } } internal bool IgnoreExtensions { get { return _ignoreExtensions; } set { _ignoreExtensions = value; } } internal bool IsConnected { get { if (_readyState != WebSocketState.Open) { return _readyState == WebSocketState.Closing; } return true; } } public static string Header_UserAgent { get { return _header_UserAgent; } set { if (string.IsNullOrWhiteSpace(value)) { _header_UserAgent = string.Empty; } else { _header_UserAgent = value; } } } public CompressionMethod Compression { get { return _compression; } set { string text = null; if (!_client) { text = "This instance is not a client."; throw new InvalidOperationException(text); } if (!canSet(out text)) { _logger.Warn(text); return; } lock (_forState) { if (!canSet(out text)) { _logger.Warn(text); } else { _compression = value; } } } } public IEnumerable<WebSocketSharp.Net.Cookie> Cookies { get { lock (_cookies.SyncRoot) { foreach (WebSocketSharp.Net.Cookie cookie in _cookies) { yield return cookie; } } } } public WebSocketSharp.Net.NetworkCredential Credentials => _credentials; public bool EmitOnPing { get { return _emitOnPing; } set { _emitOnPing = value; } } public bool EnableRedirection { get { return _enableRedirection; } set { string text = null; if (!_client) { text = "This instance is not a client."; throw new InvalidOperationException(text); } if (!canSet(out text)) { _logger.Warn(text); return; } lock (_forState) { if (!canSet(out text)) { _logger.Warn(text); } else { _enableRedirection = value; } } } } public string Extensions => _extensions ?? string.Empty; public bool IsAlive => ping(EmptyBytes); public bool IsSecure => _secure; public Logger Log { get { return _logger; } internal set { _logger = value; } } public string Origin { get { return _origin; } set { string text = null; if (!_client) { text = "This instance is not a client."; throw new InvalidOperationException(text); } if (!value.IsNullOrEmpty()) { if (!Uri.TryCreate(value, UriKind.Absolute, out Uri result)) { text = "Not an absolute URI string."; throw new ArgumentException(text, "value"); } if (result.Segments.Length > 1) { text = "It includes the path segments."; throw new ArgumentException(text, "value"); } } if (!canSet(out text)) { _logger.Warn(text); return; } lock (_forState) { if (!canSet(out text)) { _logger.Warn(text); return; } _origin = ((!value.IsNullOrEmpty()) ? value.TrimEnd(new char[1] { '/' }) : value); } } } public string Protocol { get { return _protocol ?? string.Empty; } internal set { _protocol = value; } } public WebSocketState ReadyState => _readyState; public ClientSslConfiguration SslConfiguration { get { if (!_client) { throw new InvalidOperationException("This instance is not a client."); } if (!_secure) { throw new InvalidOperationException("This instance does not use a secure connection."); } return getSslConfiguration(); } } public Uri Url { get { if (!_client) { return _context.RequestUri; } return _uri; } } public TimeSpan WaitTime { get { return _waitTime; } set { if (value <= TimeSpan.Zero) { throw new ArgumentOutOfRangeException("value", "Zero or less."); } if (!canSet(out var text)) { _logger.Warn(text); return; } lock (_forState) { if (!canSet(out text)) { _logger.Warn(text); } else { _waitTime = value; } } } } public event EventHandler<CloseEventArgs> OnClose; public event EventHandler<ErrorEventArgs> OnError; public event EventHandler<MessageEventArgs> OnMessage; public event EventHandler OnOpen; static WebSocket() { _header_UserAgent = "websocket-sharp/1.0"; _maxRetryCountForConnect = 10; EmptyBytes = new byte[0]; FragmentLength = 1016; RandomNumber = new RNGCryptoServiceProvider(); } internal WebSocket(HttpListenerWebSocketContext context, string protocol) { _context = context; _protocol = protocol; _closeContext = context.Close; _logger = context.Log; _message = messages; _secure = context.IsSecureConnection; _stream = context.Stream; _waitTime = TimeSpan.FromSeconds(1.0); init(); } internal WebSocket(TcpListenerWebSocketContext context, string protocol) { _context = context; _protocol = protocol; _closeContext = context.Close; _logger = context.Log; _message = messages; _secure = context.IsSecureConnection; _stream = context.Stream; _waitTime = TimeSpan.FromSeconds(1.0); init(); } public WebSocket(string url, params string[] protocols) { if (url == null) { throw new ArgumentNullException("url"); } if (url.Length == 0) { throw new ArgumentException("An empty string.", "url"); } if (!url.TryCreateWebSocketUri(out _uri, out var text)) { throw new ArgumentException(text, "url"); } if (protocols != null && protocols.Length != 0) { if (!checkProtocols(protocols, out text)) { throw new ArgumentException(text, "protocols"); } _protocols = protocols; } _base64Key = CreateBase64Key(); _client = true; _logger = new Logger(); _message = messagec; _secure = _uri.Scheme == "wss"; _waitTime = TimeSpan.FromSeconds(5.0); init(); } private bool accept() { if (_readyState == WebSocketState.Open) { string text = "The handshake request has already been accepted."; _logger.Warn(text); return false; } lock (_forState) { if (_readyState == WebSocketState.Open) { string text2 = "The handshake request has already been accepted."; _logger.Warn(text2); return false; } if (_readyState == WebSocketState.Closing) { string text3 = "The close process has set in."; _logger.Error(text3); text3 = "An interruption has occurred while attempting to accept."; error(text3, null); return false; } if (_readyState == WebSocketState.Closed) { string text4 = "The connection has been closed."; _logger.Error(text4); text4 = "An interruption has occurred while attempting to accept."; error(text4, null); return false; } try { if (!acceptHandshake()) { return false; } } catch (Exception ex) { _logger.Fatal(ex.Message); _logger.Debug(ex.ToString()); string text5 = "An exception has occurred while attempting to accept."; fatal(text5, ex); return false; } _readyState = WebSocketState.Open; return true; } } private bool acceptHandshake() { _logger.Debug($"A handshake request from {_context.UserEndPoint}:\n{_context}"); if (!checkHandshakeRequest(_context, out var text)) { _logger.Error(text); refuseHandshake(CloseStatusCode.ProtocolError, "A handshake error has occurred while attempting to accept."); return false; } if (!customCheckHandshakeRequest(_context, out text)) { _logger.Error(text); refuseHandshake(CloseStatusCode.PolicyViolation, "A handshake error has occurred while attempting to accept."); return false; } _base64Key = _context.Headers["Sec-WebSocket-Key"]; if (_protocol != null) { IEnumerable<string> secWebSocketProtocols = _context.SecWebSocketProtocols; processSecWebSocketProtocolClientHeader(secWebSocketProtocols); } if (!_ignoreExtensions) { string value = _context.Headers["Sec-WebSocket-Extensions"]; processSecWebSocketExtensionsClientHeader(value); } return sendHttpResponse(createHandshakeResponse()); } private bool canSet(out string message) { message = null; if (_readyState == WebSocketState.Open) { message = "The connection has already been established."; return false; } if (_readyState == WebSocketState.Closing) { message = "The connection is closing."; return false; } return true; } private bool checkHandshakeRequest(WebSocketContext context, out string message) { message = null; if (!context.IsWebSocketRequest) { message = "Not a handshake request."; return false; } if (context.RequestUri == null) { message = "It specifies an invalid Request-URI."; return false; } NameValueCollection headers = context.Headers; string text = headers["Sec-WebSocket-Key"]; if (text == null) { message = "It includes no Sec-WebSocket-Key header."; return false; } if (text.Length == 0) { message = "It includes an invalid Sec-WebSocket-Key header."; return false; } string text2 = headers["Sec-WebSocket-Version"]; if (text2 == null) { message = "It includes no Sec-WebSocket-Version header."; return false; } if (text2 != "13") { message = "It includes an invalid Sec-WebSocket-Version header."; return false; } string text3 = headers["Sec-WebSocket-Protocol"]; if (text3 != null && text3.Length == 0) { message = "It includes an invalid Sec-WebSocket-Protocol header."; return false; } if (!_ignoreExtensions) { string text4 = headers["Sec-WebSocket-Extensions"]; if (text4 != null && text4.Length == 0) { message = "It includes an invalid Sec-WebSocket-Extensions header."; return false; } } return true; } private bool checkHandshakeResponse(HttpResponse response, out string message) { message = null; if (response.IsRedirect) { message = "Indicates the redirection."; return false; } if (response.IsUnauthorized) { message = "Requires the authentication."; return false; } if (!response.IsWebSocketResponse) { message = "Not a WebSocket handshake response."; return false; } NameValueCollection headers = response.Headers; if (!validateSecWebSocketAcceptHeader(headers["Sec-WebSocket-Accept"])) { message = "Includes no Sec-WebSocket-Accept header, or it has an invalid value."; return false; } if (!validateSecWebSocketProtocolServerHeader(headers["Sec-WebSocket-Protocol"])) { message = "Includes no Sec-WebSocket-Protocol header, or it has an invalid value."; return false; } if (!validateSecWebSocketExtensionsServerHeader(headers["Sec-WebSocket-Extensions"])) { message = "Includes an invalid Sec-WebSocket-Extensions header."; return false; } if (!validateSecWebSocketVersionServerHeader(headers["Sec-WebSocket-Version"])) { message = "Includes an invalid Sec-WebSocket-Version header."; return false; } return true; } private static bool checkProtocols(string[] protocols, out string message) { message = null; Func<string, bool> condition = (string protocol) => protocol.IsNullOrEmpty() || !protocol.IsToken(); if (protocols.Contains(condition)) { message = "It contains a value that is not a token."; return false; } if (protocols.ContainsTwice()) { message = "It contains a value twice."; return false; } return true; } private bool checkReceivedFrame(WebSocketFrame frame, out string message) { message = null; bool isMasked = frame.IsMasked; if (_client && isMasked) { message = "A frame from the server is masked."; return false; } if (!_client && !isMasked) { message = "A frame from a client is not masked."; return false; } if (_inContinuation && frame.IsData) { message = "A data frame has been received while receiving continuation frames."; return false; } if (frame.IsCompressed && _compression == CompressionMethod.None) { message = "A compressed frame has been received without any agreement for it."; return false; } if (frame.Rsv2 == Rsv.On) { message = "The RSV2 of a frame is non-zero without any negotiation for it."; return false; } if (frame.Rsv3 == Rsv.On) { message = "The RSV3 of a frame is non-zero without any negotiation for it."; return false; } return true; } private void close(ushort code, string reason) { if (_readyState == WebSocketState.Closing) { _logger.Info("The closing is already in progress."); return; } if (_readyState == WebSocketState.Closed) { _logger.Info("The connection has already been closed."); return; } if (code == 1005) { close(PayloadData.Empty, send: true, receive: true, received: false); return; } bool receive = !code.IsReserved(); close(new PayloadData(code, reason), receive, receive, received: false); } private void close(PayloadData payloadData, bool send, bool receive, bool received) { lock (_forState) { if (_readyState == WebSocketState.Closing) { _logger.Info("The closing is already in progress."); return; } if (_readyState == WebSocketState.Closed) { _logger.Info("The connection has already been closed."); return; } send = send && _readyState == WebSocketState.Open; receive = send && receive; _readyState = WebSocketState.Closing; } _logger.Trace("Begin closing the connection."); bool clean = closeHandshake(payloadData, send, receive, received); releaseResources(); _logger.Trace("End closing the connection."); _readyState = WebSocketState.Closed; CloseEventArgs e = new CloseEventArgs(payloadData, clean); try { this.OnClose.Emit(this, e); } catch (Exception ex) { _logger.Error(ex.Message); _logger.Debug(ex.ToString()); } } private void closeAsync(ushort code, string reason) { if (_readyState == WebSocketState.Closing) { _logger.Info("The closing is already in progress."); return; } if (_readyState == WebSocketState.Closed) { _logger.Info("The connection has already been closed."); return; } if (code == 1005) { closeAsync(PayloadData.Empty, send: true, receive: true, received: false); return; } bool receive = !code.IsReserved(); closeAsync(new PayloadData(code, reason), receive, receive, received: false); } private void closeAsync(PayloadData payloadData, bool send, bool receive, bool received) { Action<PayloadData, bool, bool, bool> closer = close; closer.BeginInvoke(payloadData, send, receive, received, delegate(IAsyncResult ar) { closer.EndInvoke(ar); }, null); } private bool closeHandshake(byte[] frameAsBytes, bool receive, bool received) { bool flag = frameAsBytes != null && sendBytes(frameAsBytes); if (!received && flag && receive && _receivingExited != null) { received = _receivingExited.WaitOne(_waitTime); } bool flag2 = flag && received; _logger.Debug($"Was clean?: {flag2}\n sent: {flag}\n received: {received}"); return flag2; } private bool closeHandshake(PayloadData payloadData, bool send, bool receive, bool received) { bool flag = false; if (send) { WebSocketFrame webSocketFrame = WebSocketFrame.CreateCloseFrame(payloadData, _client); flag = sendBytes(webSocketFrame.ToArray()); if (_client) { webSocketFrame.Unmask(); } } if (!received && flag && receive && _receivingExited != null) { received = _receivingExited.WaitOne(_waitTime); } bool flag2 = flag && received; _logger.Debug($"Was clean?: {flag2}\n sent: {flag}\n received: {received}"); return flag2; } private bool connect() { if (_readyState == WebSocketState.Open) { string text = "The connection has already been established."; _logger.Warn(text); return false; } lock (_forState) { if (_readyState == WebSocketState.Open) { string text2 = "The connection has already been established."; _logger.Warn(text2); return false; } if (_readyState == WebSocketState.Closing) { string text3 = "The close process has set in."; _logger.Error(text3); text3 = "An interruption has occurred while attempting to connect."; error(text3, null); return false; } if (_retryCountForConnect > _maxRetryCountForConnect) { string text4 = "An opportunity for reconnecting has been lost."; _logger.Error(text4); text4 = "An interruption has occurred while attempting to connect."; error(text4, null); return false; } _readyState = WebSocketState.Connecting; try { doHandshake(); } catch (Exception ex) { _retryCountForConnect++; _logger.Fatal(ex.Message); _logger.Debug(ex.ToString()); string text5 = "An exception has occurred while attempting to connect."; fatal(text5, ex); return false; } _retryCountForConnect = 1; _readyState = WebSocketState.Open; return true; } } private string createExtensions() { StringBuilder stringBuilder = new StringBuilder(80); if (_compression != CompressionMethod.None) { string arg = _compression.ToExtensionString("server_no_context_takeover", "client_no_context_takeover"); stringBuilder.AppendFormat("{0}, ", arg); } int length = stringBuilder.Length; if (length > 2) { stringBuilder.Length = length - 2; return stringBuilder.ToString(); } return null; } private HttpResponse createHandshakeFailureResponse(WebSocketSharp.Net.HttpStatusCode code) { HttpResponse httpResponse = HttpResponse.CreateCloseResponse(code); httpResponse.Headers["Sec-WebSocket-Version"] = "13"; return httpResponse; } public void AddUserHeader(string name, string value) { _userHeaders.Add(name, value); } public void RemoveUserHeader(string name) { _userHeaders.Remove(name); } public void ClearUserHeader() { _userHeaders.Clear(); } private HttpRequest createHandshakeRequest() { HttpRequest httpRequest = HttpRequest.CreateWebSocketRequest(_uri); NameValueCollection headers = httpRequest.Headers; if (!_origin.IsNullOrEmpty()) { headers["Origin"] = _origin; } headers["Sec-WebSocket-Key"] = _base64Key; _protocolsRequested = _protocols != null; if (_protocolsRequested) { headers["Sec-WebSocket-Protocol"] = _protocols.ToString(", "); } _extensionsRequested = _compression != CompressionMethod.None; if (_extensionsRequested) { headers["Sec-WebSocket-Extensions"] = createExtensions(); } headers["Sec-WebSocket-Version"] = "13"; AuthenticationResponse authenticationResponse = null; if (_authChallenge != null && _credentials != null) { authenticationResponse = new AuthenticationResponse(_authChallenge, _credentials, _nonceCount); _nonceCount = authenticationResponse.NonceCount; } else if (_preAuth) { authenticationResponse = new AuthenticationResponse(_credentials); } if (authenticationResponse != null) { headers["Authorization"] = authenticationResponse.ToString(); } if (_cookies.Count > 0) { httpRequest.SetCookies(_cookies); } if (_userHeaders != null && _userHeaders.Count > 0) { foreach (string userHeader in _userHeaders) { headers.Add(userHeader, _userHeaders[userHeader]); } } return httpRequest; } private HttpResponse createHandshakeResponse() { HttpResponse httpResponse = HttpResponse.CreateWebSocketResponse(); NameValueCollection headers = httpResponse.Headers; headers["Sec-WebSocket-Accept"] = CreateResponseKey(_base64Key); if (_protocol != null) { headers["Sec-WebSocket-Protocol"] = _protocol; } if (_extensions != null) { headers["Sec-WebSocket-Extensions"] = _extensions; } if (_cookies.Count > 0) { httpResponse.SetCookies(_cookies); } return httpResponse; } private bool customCheckHandshakeRequest(WebSocketContext context, out string message) { message = null; if (_handshakeRequestChecker == null) { return true; } message = _handshakeRequestChecker(context); return message == null; } private MessageEventArgs dequeueFromMessageEventQueue() { lock (_forMessageEventQueue) { return (_messageEventQueue.Count > 0) ? _messageEventQueue.Dequeue() : null; } } private void doHandshake() { setClientStream(); HttpResponse httpResponse = sendHandshakeRequest(); if (!checkHandshakeResponse(httpResponse, out var text)) { throw new WebSocketException(CloseStatusCode.ProtocolError, text); } if (_protocolsRequested) { _protocol = httpResponse.Headers["Sec-WebSocket-Protocol"]; } if (_extensionsRequested) { processSecWebSocketExtensionsServerHeader(httpResponse.Headers["Sec-WebSocket-Extensions"]); } processCookies(httpResponse.Cookies); } private void enqueueToMessageEventQueue(MessageEventArgs e) { lock (_forMessageEventQueue) { _messageEventQueue.Enqueue(e); } } private void error(string message, Exception exception) { try { this.OnError.Emit(this, new ErrorEventArgs(message, exception)); } catch (Exception ex) { _logger.Error(ex.Message); _logger.Debug(ex.ToString()); } } private void fatal(string message, Exception exception) { CloseStatusCode code = ((exception is WebSocketException) ? ((WebSocketException)exception).Code : CloseStatusCode.Abnormal); fatal(message, (ushort)code); } private void fatal(string message, ushort code) { PayloadData payloadData = new PayloadData(code, message); close(payloadData, !code.IsReserved(), receive: false, received: false); } private void fatal(string message, CloseStatusCode code) { fatal(message, (ushort)code); } private ClientSslConfiguration getSslConfiguration() { if (_sslConfig == null) { _sslConfig = new ClientSslConfiguration(_uri.DnsSafeHost); } return _sslConfig; } private void init() { _compression = CompressionMethod.None; _cookies = new WebSocketSharp.Net.CookieCollection(); _forPing = new object(); _forSend = new object(); _forState = new object(); _messageEventQueue = new Queue<MessageEventArgs>(); _forMessageEventQueue = ((ICollection)_messageEventQueue).SyncRoot; _readyState = WebSocketState.Connecting; } private void message() { MessageEventArgs obj = null; lock (_forMessageEventQueue) { if (_inMessage || _messageEventQueue.Count == 0 || _readyState != WebSocketState.Open) { return; } _inMessage = true; obj = _messageEventQueue.Dequeue(); } _message(obj); } private void messagec(MessageEventArgs e) { while (true) { try { this.OnMessage.Emit(this, e); } catch (Exception ex) { _logger.Error(ex.ToString()); error("An error has occurred during an OnMessage event.", ex); } lock (_forMessageEventQueue) { if (_messageEventQueue.Count == 0 || _readyState != WebSocketState.Open) { _inMessage = false; break; } e = _messageEventQueue.Dequeue(); } } } private void messages(MessageEventArgs e) { try { this.OnMessage.Emit(this, e); } catch (Exception ex) { _logger.Error(ex.ToString()); error("An error has occurred during an OnMessage event.", ex); } lock (_forMessageEventQueue) { if (_messageEventQueue.Count == 0 || _readyState != WebSocketState.Open) { _inMessage = false; return; } e = _messageEventQueue.Dequeue(); } ThreadPool.QueueUserWorkItem(delegate { messages(e); }); } private void open() { _inMessage = true; startReceiving(); try { this.OnOpen.Emit(this, EventArgs.Empty); } catch (Exception ex) { _logger.Error(ex.ToString()); error("An error has occurred during the OnOpen event.", ex); } MessageEventArgs obj = null; lock (_forMessageEventQueue) { if (_messageEventQueue.Count == 0 || _readyState != WebSocketState.Open) { _inMessage = false; return; } obj = _messageEventQueue.Dequeue(); } _message.BeginInvoke(obj, delegate(IAsyncResult ar) { _message.EndInvoke(ar); }, null); } private bool ping(byte[] data) { if (_readyState != WebSocketState.Open) { return false; } ManualResetEvent pongReceived = _pongReceived; if (pongReceived == null) { return false; } lock (_forPing) { try { pongReceived.Reset(); if (!send(Fin.Final, Opcode.Ping, data, compressed: false)) { return false; } return pongReceived.WaitOne(_waitTime); } catch (ObjectDisposedException) { return false; } } } private bool processCloseFrame(WebSocketFrame frame) { PayloadData payloadData = frame.PayloadData; close(payloadData, !payloadData.HasReservedCode, receive: false, received: true); return false; } private void processCookies(WebSocketSharp.Net.CookieCollection cookies) { if (cookies.Count != 0) { _cookies.SetOrRemove(cookies); } } private bool processDataFrame(WebSocketFrame frame) { enqueueToMessageEventQueue(frame.IsCompressed ? new MessageEventArgs(frame.Opcode, frame.PayloadData.ApplicationData.Decompress(_compression)) : new MessageEventArgs(frame)); return true; } private bool processFragmentFrame(WebSocketFrame frame) { if (!_inContinuation) { if (frame.IsContinuation) { return true; } _fragmentsOpcode = frame.Opcode; _fragmentsCompressed = frame.IsCompressed; _fragmentsBuffer = new MemoryStream(); _inContinuation = true; } _fragmentsBuffer.WriteBytes(frame.PayloadData.ApplicationData, 1024); if (frame.IsFinal) { using (_fragmentsBuffer) { byte[] rawData = (_fragmentsCompressed ? _fragmentsBuffer.DecompressToArray(_compression) : _fragmentsBuffer.ToArray()); enqueueToMessageEventQueue(new MessageEventArgs(_fragmentsOpcode, rawData)); } _fragmentsBuffer = null; _inContinuation = false; } return true; } private bool processPingFrame(WebSocketFrame frame) { _logger.Trace("A ping was received."); WebSocketFrame webSocketFrame = WebSocketFrame.CreatePongFrame(frame.PayloadData, _client); lock (_forState) { if (_readyState != WebSocketState.Open) { _logger.Error("The connection is closing."); return true; } if (!sendBytes(webSocketFrame.ToArray())) { return false; } } _logger.Trace("A pong to this ping has been sent."); if (_emitOnPing) { if (_client) { webSocketFrame.Unmask(); } enqueueToMessageEventQueue(new MessageEventArgs(frame)); } return true; } private bool processPongFrame(WebSocketFrame frame) { _logger.Trace("A pong was received."); try { _pongReceived.Set(); } catch (NullReferenceException ex) { _logger.Error(ex.Message); _logger.Debug(ex.ToString()); return false; } catch (ObjectDisposedException ex2) { _logger.Error(ex2.Message); _logger.Debug(ex2.ToString()); return false; } _logger.Trace("It has been signaled."); return true; } private bool processReceivedFrame(WebSocketFrame frame) { if (!checkReceivedFrame(frame, out var text)) { throw new WebSocketException(CloseStatusCode.ProtocolError, text); } frame.Unmask(); if (!frame.IsFragment) { if (!frame.IsData) { if (!frame.IsPing) { if (!frame.IsPong) { if (!frame.IsClose) { return processUnsupportedFrame(frame); } return processCloseFrame(frame); } return processPongFrame(frame); } return processPingFrame(frame); } return processDataFrame(frame); } return processFragmentFrame(frame); } private void processSecWebSocketExtensionsClientHeader(string value) { if (value == null) { return; } StringBuilder stringBuilder = new StringBuilder(80); bool flag = false; foreach (string item in value.SplitHeaderValue(',')) { string text = item.Trim(); if (text.Length != 0 && !flag && text.IsCompressionExtension(CompressionMethod.Deflate)) { _compression = CompressionMethod.Deflate; stringBuilder.AppendFormat("{0}, ", _compression.ToExtensionString("client_no_context_takeover", "server_no_context_takeover")); flag = true; } } int length = stringBuilder.Length; if (length > 2) { stringBuilder.Length = length - 2; _extensions = stringBuilder.ToString(); } } private void processSecWebSocketExtensionsServerHeader(string value) { if (value == null) { _compression = CompressionMethod.None; } else { _extensions = value; } } private void processSecWebSocketProtocolClientHeader(IEnumerable<string> values) { if (!values.Contains((string val) => val == _protocol)) { _protocol = null; } } private bool processUnsupportedFrame(WebSocketFrame frame) { _logger.Fatal("An unsupported frame:" + frame.PrintToString(dumped: false)); fatal("There is no way to handle it.", CloseStatusCode.PolicyViolation); return false; } private void refuseHandshake(CloseStatusCode code, string reason) { _readyState = WebSocketState.Closing; HttpResponse response = createHandshakeFailureResponse(WebSocketSharp.Net.HttpStatusCode.BadRequest); sendHttpResponse(response); releaseServerResources(); _readyState = WebSocketState.Closed; CloseEventArgs e = new CloseEventArgs((ushort)code, reason, clean: false); try { this.OnClose.Emit(this, e); } catch (Exception ex) { _logger.Error(ex.Message); _logger.Debug(ex.ToString()); } } private void releaseClientResources() { if (_stream != null) { _stream.Dispose(); _stream = null; } if (_tcpClient != null) { _tcpClient.Close(); _tcpClient = null; } } private void releaseCommonResources() { if (_fragmentsBuffer != null) { _fragmentsBuffer.Dispose(); _fragmentsBuffer = null; _inContinuation = false; } if (_pongReceived != null) { _pongReceived.Close(); _pongReceived = null; } if (_receivingExited != null) { _receivingExited.Close(); _receivingExited = null; } } private void releaseResources() { if (_client) { releaseClientResources(); } else { releaseServerResources(); } releaseCommonResources(); } private void releaseServerResources() { if (_closeContext != null) { _closeContext(); _closeContext = null; _stream = null; _context = null; } } private bool send(Opcode opcode, Stream stream) { lock (_forSend) { Stream stream2 = stream; bool flag = false; bool flag2 = false; try { if (_compression != CompressionMethod.None) { stream = stream.Compress(_compression); flag = true; } flag2 = send(opcode, stream, flag); if (!flag2) { error("A send has been interrupted.", null); } } catch (Exception ex) { _logger.Error(ex.ToString()); error("An error has occurred during a send.", ex); } finally { if (flag) { stream.Dispose(); } stream2.Dispose(); } return flag2; } } private bool send(Opcode opcode, Stream stream, bool compressed) { long length = stream.Length; if (length == 0L) { return send(Fin.Final, opcode, EmptyBytes, compressed: false); } long num = length / FragmentLength; int num2 = (int)(length % FragmentLength); byte[] array = null; switch (num) { case 0L: array = new byte[num2]; if (stream.Read(array, 0, num2) == num2) { return send(Fin.Final, opcode, array, compressed); } return false; case 1L: if (num2 == 0) { array = new byte[FragmentLength]; if (stream.Read(array, 0, FragmentLength) == FragmentLength) { return send(Fin.Final, opcode, array, compressed); } return false; } break; } array = new byte[FragmentLength]; if (stream.Read(array, 0, FragmentLength) != FragmentLength || !send(Fin.More, opcode, array, compressed)) { return false; } long num3 = ((num2 == 0) ? (num - 2) : (num - 1)); for (long num4 = 0L; num4 < num3; num4++) { if (stream.Read(array, 0, FragmentLength) != FragmentLength || !send(Fin.More, Opcode.Cont, array, compressed: false)) { return false; } } if (num2 == 0) { num2 = FragmentLength; } else { array = new byte[num2]; } if (stream.Read(array, 0, num2) == num2) { return send(Fin.Final, Opcode.Cont, array, compressed: false); } return false; } private bool send(Fin fin, Opcode opcode, byte[] data, bool compressed) { lock (_forState) { if (_readyState != WebSocketState.Open) { _logger.Error("The connection is closing."); return false; } WebSocketFrame webSocketFrame = new WebSocketFrame(fin, opcode, data, compressed, _client); return sendBytes(webSocketFrame.ToArray()); } } private void sendAsync(Opcode opcode, Stream stream, Action<bool> completed) { Func<Opcode, Stream, bool> sender = send; sender.BeginInvoke(opcode, stream, delegate(IAsyncResult ar) { try { bool obj = sender.EndInvoke(ar); if (completed != null) { completed(obj); } } catch (Exception ex) { _logger.Error(ex.ToString()); error("An error has occurred during the callback for an async send.", ex); } }, null); } private bool sendBytes(byte[] bytes) { try { _stream.Write(bytes, 0, bytes.Length); } catch (Exception ex) { _logger.Error(ex.Message); _logger.Debug(ex.ToString()); return false; } return true; } private HttpResponse sendHandshakeRequest() { HttpRequest httpRequest = createHandshakeRequest(); HttpResponse httpResponse = sendHttpRequest(httpRequest, 90000); if (httpResponse.IsUnauthorized) { string text = httpResponse.Headers["WWW-Authenticate"]; _logger.Warn($"Received an authentication requirement for '{text}'."); if (text.IsNullOrEmpty()) { _logger.Error("No authentication challenge is specified."); return httpResponse; } _authChallenge = AuthenticationChallenge.Parse(text); if (_authChallenge == null) { _logger.Error("An invalid authentication challenge is specified."); return httpResponse; } if (_credentials != null && (!_preAuth || _authChallenge.Scheme == WebSocketSharp.Net.AuthenticationSchemes.Digest)) { if (httpResponse.HasConnectionClose) { releaseClientResources(); setClientStream(); } AuthenticationResponse authenticationResponse = new AuthenticationResponse(_authChallenge, _credentials, _nonceCount); _nonceCount = authenticationResponse.NonceCount; httpRequest.Headers["Authorization"] = authenticationResponse.ToString(); httpResponse = sendHttpRequest(httpRequest, 15000); } } if (httpResponse.IsRedirect) { string text2 = httpResponse.Headers["Location"]; _logger.Warn($"Received a redirection to '{text2}'."); if (_enableRedirection) { if (text2.IsNullOrEmpty()) { _logger.Error("No url to redirect is located."); return httpResponse; } if (!text2.TryCreateWebSocketUri(out var result, out var text3)) { _logger.Error("An invalid url to redirect is located: " + text3); return httpResponse; } releaseClientResources(); _uri = result; _secure = result.Scheme == "wss"; setClientStream(); return sendHandshakeRequest(); } } return httpResponse; } private HttpResponse sendHttpRequest(HttpRequest request, int millisecondsTimeout) { _logger.Debug("A request to the server:\n" + request.ToString()); HttpResponse response = request.GetResponse(_stream, millisecondsTimeout); _logger.Debug("A response to this request:\n" + response.ToString()); return response; } private bool sendHttpResponse(HttpResponse response) { _logger.Debug($"A response to {_context.UserEndPoint}:\n{response}"); return sendBytes(response.ToByteArray()); } private void sendProxyConnectRequest() { HttpRequest httpRequest = HttpRequest.CreateConnectRequest(_uri); HttpResponse httpResponse = sendHttpRequest(httpRequest, 90000); if (httpResponse.IsProxyAuthenticationRequired) { string text = httpResponse.Headers["Proxy-Authenticate"]; _logger.Warn($"Received a proxy authentication requirement for '{text}'."); if (text.IsNullOrEmpty()) { throw new WebSocketException("No proxy authentication challenge is specified."); } AuthenticationChallenge authenticationChallenge = AuthenticationChallenge.Parse(text); if (authenticationChallenge == null) { throw new WebSocketException("An invalid proxy authentication challenge is specified."); } if (_proxyCredentials != null) { if (httpResponse.HasConnectionClose) { releaseClientResources(); _tcpClient = new TcpClient(_proxyUri.DnsSafeHost, _proxyUri.Port); _stream = _tcpClient.GetStream(); } AuthenticationResponse authenticationResponse = new AuthenticationResponse(authenticationChallenge, _proxyCredentials, 0u); httpRequest.Headers["Proxy-Authorization"] = authenticationResponse.ToString(); httpResponse = sendHttpRequest(httpRequest, 15000); } if (httpResponse.IsProxyAuthenticationRequired) { throw new WebSocketException("A proxy authentication is required."); } } if (httpResponse.StatusCode[0] != '2') { throw new WebSocketException("The proxy has failed a connection to the requested host and port."); } } private void setClientStream() { if (_proxyUri != null) { _tcpClient = new TcpClient(_proxyUri.DnsSafeHost, _proxyUri.Port); _stream = _tcpClient.GetStream(); sendProxyConnectRequest(); } else { _tcpClient = new TcpClient(_uri.DnsSafeHost, _uri.Port); _stream = _tcpClient.GetStream(); } if (_secure) { ClientSslConfiguration sslConfiguration = getSslConfiguration(); string targetHost = sslConfiguration.TargetHost; if (targetHost != _uri.DnsSafeHost) { throw new WebSocketException(CloseStatusCode.TlsHandshakeFailure, "An invalid host name is specified."); } try { SslStream sslStream = new SslStream(_stream, leaveInnerStreamOpen: false, sslConfiguration.ServerCertificateValidationCallback, sslConfiguration.ClientCertificateSelectionCallback); sslStream.AuthenticateAsClient(targetHost, sslConfiguration.ClientCertificates, sslConfiguration.EnabledSslProtocols, sslConfiguration.CheckCertificateRevocation); _stream = sslStream; } catch (Exception innerException) { throw new WebSocketException(CloseStatusCode.TlsHandshakeFailure, innerException); } } } private void startReceiving() { if (_messageEventQueue.Count > 0) { _messageEventQueue.Clear(); } _pongReceived = new ManualResetEvent(initialState: false); _receivingExited = new ManualResetEvent(initialState: false); Action receive = null; receive = delegate { WebSocketFrame.ReadFrameAsync(_stream, unmask: false, delegate(WebSocketFrame frame) { if (!processReceivedFrame(frame) || _readyState == WebSocketState.Closed) { _receivingExited?.Set(); } else { receive(); if (!_inMessage && HasMessage && _readyState == WebSocketState.Open) { message(); } } }, delegate(Exception ex) { _logger.Fatal(ex.ToString()); fatal("An exception has occurred while receiving.", ex); }); }; receive(); } private bool validateSecWebSocketAcceptHeader(string value) { if (value != null) { return value == CreateResponseKey(_base64Key); } return false; } private bool validateSecWebSocketExtensionsServerHeader(string value) { if (value == null) { return true; } if (value.Length == 0) { return false; } if (!_extensionsRequested) { return false; } bool flag = _compression != CompressionMethod.None; foreach (string item in value.SplitHeaderValue(',')) { string text = item.Trim(); if (flag && text.IsCompressionExtension(_compression)) { if (!text.Contains("server_no_context_takeover")) { _logger.Error("The server hasn't sent back 'server_no_context_takeover'."); return false; } if (!text.Contains("client_no_context_takeover")) { _logger.Warn("The server hasn't sent back 'client_no_context_takeover'."); } string method = _compression.ToExtensionString(); if (text.SplitHeaderValue(';').Contains(delegate(string t) { t = t.Trim(); return t != method && t != "server_no_context_takeover" && t != "client_no_context_takeover"; })) { return false; } continue; } return false; } return true; } private bool validateSecWebSocketProtocolServerHeader(string value) { if (value == null) { return !_protocolsRequested; } if (value.Length == 0) { return false; } if (_protocolsRequested) { return _protocols.Contains((string p) => p == value); } return false; } private bool validateSecWebSocketVersionServerHeader(string value) { if (value != null) { return value == "13"; } return true; } internal void Close(HttpResponse response) { _readyState = WebSocketState.Closing; sendHttpResponse(response); releaseServerResources(); _readyState = WebSocketState.Closed; } internal void Close(WebSocketSharp.Net.HttpStatusCode code) { Close(createHandshakeFailureResponse(code)); } internal void Close(PayloadData payloadData, byte[] frameAsBytes) { lock (_forState) { if (_readyState == WebSocketState.Closing) { _logger.Info("The closing is already in progress."); return; } if (_readyState == WebSocketState.Closed) { _logger.Info("The connection has already been closed."); return; } _readyState = WebSocketState.Closing; } _logger.Trace("Begin closing the connection."); bool flag = frameAsBytes != null && sendBytes(frameAsBytes); bool flag2 = flag && _receivingExited != null && _receivingExited.WaitOne(_waitTime); bool flag3 = flag && flag2; _logger.Debug($"Was clean?: {flag3}\n sent: {flag}\n received: {flag2}"); releaseServerResources(); releaseCommonResources(); _logger.Trace("End closing the connection."); _readyState = WebSocketState.Closed; CloseEventArgs e = new CloseEventArgs(payloadData, flag3); try { this.OnClose.Emit(this, e); } catch (Exception ex) { _logger.Error(ex.Message); _logger.Debug(ex.ToString()); } } internal static string CreateBase64Key() { byte[] array = new byte[16]; RandomNumber.GetBytes(array); return Convert.ToBase64String(array); } internal static string CreateResponseKey(string base64Key) { StringBuilder stringBuilder = new StringBuilder(base64Key, 64); stringBuilder.Append("258EAFA5-E914-47DA-95CA-C5AB0DC85B11"); return Convert.ToBase64String(new SHA1CryptoServiceProvider().ComputeHash(stringBuilder.ToString().GetUTF8EncodedBytes())); } internal void InternalAccept() { try { if (!acceptHandshake()) { return; } } catch (Exception ex) { _logger.Fatal(ex.Message); _logger.Debug(ex.ToString()); string text = "An exception has occurred while attempting to accept."; fatal(text, ex); return; } _readyState = WebSocketState.Open; open(); } internal bool Ping(byte[] frameAsBytes, TimeSpan timeout) { if (_readyState != WebSocketState.Open) { return false; } ManualResetEvent pongReceived = _pongReceived; if (pongReceived == null) { return false; } lock (_forPing) { try { pongReceived.Reset(); lock (_forState) { if (_readyState != WebSocketState.Open) { return false; } if (!sendBytes(frameAsBytes)) { return false; } } return pongReceived.WaitOne(timeout); } catch (ObjectDisposedException) { return false; } } } internal void Send(Opcode opcode, byte[] data, Dictionary<CompressionMethod, byte[]> cache) { lock (_forSend) { lock (_forState) { if (_readyState != WebSocketState.Open) { _logger.Error("The connection is closing."); return; } if (!cache.TryGetValue(_compression, out var value)) { value = new WebSocketFrame(Fin.Final, opcode, data.Compress(_compression), _compression != CompressionMethod.None, mask: false).ToArray(); cache.Add(_compression, value); } sendBytes(value); } } } internal void Send(Opcode opcode, Stream stream, Dictionary<CompressionMethod, Stream> cache) { lock (_forSend) { if (!cache.TryGetValue(_compression, out var value)) { value = stream.Compress(_compression); cache.Add(_compression, value); } else { value.Position = 0L; } send(opcode, value, _compression != CompressionMethod.None); } } public void Accept() { if (_client) { throw new InvalidOperationException("This instance is a client."); } if (_readyState == WebSocketState.Closing) { throw new InvalidOperationException("The close process is in progress."); } if (_readyState == WebSocketState.Closed) { throw new InvalidOperationException("The connection has already been closed."); } if (accept()) {
plugins/protobuf-net.dll
Decompiled 16 hours ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Buffers; using System.CodeDom.Compiler; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.Immutable; using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Threading; using System.Xml; using System.Xml.Serialization; using Microsoft.CodeAnalysis; using ProtoBuf; using ProtoBuf.Compiler; using ProtoBuf.Extensions; using ProtoBuf.Internal; using ProtoBuf.Internal.Serializers; using ProtoBuf.Meta; using ProtoBuf.Serializers; using ProtoBuf.WellKnownTypes; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyFileVersion("3.2.30.709")] [assembly: AssemblyInformationalVersion("3.2.30+02c5dfe7c9")] [assembly: InternalsVisibleTo("protobuf-net.Test, PublicKey=002400000480000094000000060200000024000052534131000400000100010009ed9caa457bfc205716c3d4e8b255a63ddf71c9e53b1b5f574ab6ffdba11e80ab4b50be9c46d43b75206280070ddba67bd4c830f93f0317504a76ba6a48243c36d2590695991164592767a7bbc4453b34694e31e20815a096e4483605139a32a76ec2fef196507487329c12047bf6a68bca8ee9354155f4d01daf6eec5ff6bc")] [assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")] [assembly: AssemblyCompany("Marc Gravell")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyCopyright("See https://github.com/protobuf-net/protobuf-net")] [assembly: AssemblyDescription("Provides simple access to fast and efficient \"Protocol Buffers\" serialization from .NET applications")] [assembly: AssemblyProduct("protobuf-net (net462)")] [assembly: AssemblyTitle("protobuf-net")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/protobuf-net/protobuf-net")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("3.0.0.0")] [assembly: TypeForwardedTo(typeof(BclHelpers))] [assembly: TypeForwardedTo(typeof(BufferExtension))] [assembly: TypeForwardedTo(typeof(CompatibilityLevel))] [assembly: TypeForwardedTo(typeof(CompatibilityLevelAttribute))] [assembly: TypeForwardedTo(typeof(DataFormat))] [assembly: TypeForwardedTo(typeof(DiscriminatedUnion128))] [assembly: TypeForwardedTo(typeof(DiscriminatedUnion128Object))] [assembly: TypeForwardedTo(typeof(DiscriminatedUnion32))] [assembly: TypeForwardedTo(typeof(DiscriminatedUnion32Object))] [assembly: TypeForwardedTo(typeof(DiscriminatedUnion64))] [assembly: TypeForwardedTo(typeof(DiscriminatedUnion64Object))] [assembly: TypeForwardedTo(typeof(DiscriminatedUnionObject))] [assembly: TypeForwardedTo(typeof(Extensible))] [assembly: TypeForwardedTo(typeof(IExtensible))] [assembly: TypeForwardedTo(typeof(IExtension))] [assembly: TypeForwardedTo(typeof(IExtensionResettable))] [assembly: TypeForwardedTo(typeof(IMeasuredProtoOutput<>))] [assembly: TypeForwardedTo(typeof(ImplicitFields))] [assembly: TypeForwardedTo(typeof(IProtoInput<>))] [assembly: TypeForwardedTo(typeof(IProtoOutput<>))] [assembly: TypeForwardedTo(typeof(MeasureState<>))] [assembly: TypeForwardedTo(typeof(MemberSerializationOptions))] [assembly: TypeForwardedTo(typeof(ProtoSyntax))] [assembly: TypeForwardedTo(typeof(TypeFormatEventArgs))] [assembly: TypeForwardedTo(typeof(TypeFormatEventHandler))] [assembly: TypeForwardedTo(typeof(TypeModel))] [assembly: TypeForwardedTo(typeof(PrefixStyle))] [assembly: TypeForwardedTo(typeof(ProtoAfterDeserializationAttribute))] [assembly: TypeForwardedTo(typeof(ProtoAfterSerializationAttribute))] [assembly: TypeForwardedTo(typeof(ProtoBeforeDeserializationAttribute))] [assembly: TypeForwardedTo(typeof(ProtoBeforeSerializationAttribute))] [assembly: TypeForwardedTo(typeof(ProtoContractAttribute))] [assembly: TypeForwardedTo(typeof(ProtoConverterAttribute))] [assembly: TypeForwardedTo(typeof(ProtoEnumAttribute))] [assembly: TypeForwardedTo(typeof(ProtoException))] [assembly: TypeForwardedTo(typeof(ProtoIgnoreAttribute))] [assembly: TypeForwardedTo(typeof(ProtoIncludeAttribute))] [assembly: TypeForwardedTo(typeof(ProtoMapAttribute))] [assembly: TypeForwardedTo(typeof(ProtoMemberAttribute))] [assembly: TypeForwardedTo(typeof(ProtoPartialIgnoreAttribute))] [assembly: TypeForwardedTo(typeof(ProtoPartialMemberAttribute))] [assembly: TypeForwardedTo(typeof(ProtoReader))] [assembly: TypeForwardedTo(typeof(ProtoTypeCode))] [assembly: TypeForwardedTo(typeof(ProtoWriter))] [assembly: TypeForwardedTo(typeof(SerializationContext))] [assembly: TypeForwardedTo(typeof(SubItemToken))] [assembly: TypeForwardedTo(typeof(TimeSpanScale))] [assembly: TypeForwardedTo(typeof(WireType))] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class IsReadOnlyAttribute : Attribute { } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class IsUnmanagedAttribute : Attribute { } } [GeneratedCode("Nerdbank.GitVersioning.Tasks", "3.5.119.9565")] [ExcludeFromCodeCoverage] internal static class ThisAssembly { internal const string AssemblyConfiguration = "Release"; internal const string AssemblyFileVersion = "3.2.30.709"; internal const string AssemblyInformationalVersion = "3.2.30+02c5dfe7c9"; internal const string AssemblyName = "protobuf-net"; internal const string AssemblyTitle = "protobuf-net"; internal const string AssemblyVersion = "3.0.0.0"; internal static readonly DateTime GitCommitDate = new DateTime(638314372430000000L, DateTimeKind.Utc); internal const string GitCommitId = "02c5dfe7c99ac8550830662ce2b9bc6e1301a493"; internal const bool IsPrerelease = false; internal const bool IsPublicRelease = true; internal const string PublicKey = "002400000480000094000000060200000024000052534131000400000100010009ed9caa457bfc205716c3d4e8b255a63ddf71c9e53b1b5f574ab6ffdba11e80ab4b50be9c46d43b75206280070ddba67bd4c830f93f0317504a76ba6a48243c36d2590695991164592767a7bbc4453b34694e31e20815a096e4483605139a32a76ec2fef196507487329c12047bf6a68bca8ee9354155f4d01daf6eec5ff6bc"; internal const string PublicKeyToken = "257b51d87d2e4d67"; internal const string RootNamespace = "ProtoBuf"; } namespace ProtoBuf { public static class Serializer { public static class NonGeneric { public static object DeepClone(object instance) { if (instance != null) { return ((TypeModel)RuntimeTypeModel.Default).DeepClone(instance); } return null; } public static void Serialize(Stream dest, object instance) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) if (instance != null) { State val = State.Create(dest, (TypeModel)(object)RuntimeTypeModel.Default, (object)null); try { ((State)(ref val)).Model.SerializeRootFallback(ref val, instance); } finally { ((State)(ref val)).Dispose(); } } } public static object Deserialize([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] Type type, Stream source) { return ((TypeModel)RuntimeTypeModel.Default).Deserialize(type, source, (object)null, (object)null, -1L); } public static object Deserialize([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] Type type, Stream source, object instance = null, object userState = null, long length = -1L) { return ((TypeModel)RuntimeTypeModel.Default).Deserialize(type, source, instance, userState, length); } public static object Deserialize([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] Type type, ReadOnlyMemory<byte> source, object instance = null, object userState = null) { return ((TypeModel)RuntimeTypeModel.Default).Deserialize(type, source, instance, userState); } public static object Deserialize([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] Type type, ReadOnlySequence<byte> source, object instance = null, object userState = null) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) return ((TypeModel)RuntimeTypeModel.Default).Deserialize(type, source, instance, userState); } public static object Deserialize([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] Type type, ReadOnlySpan<byte> source, object instance = null, object userState = null) { return ((TypeModel)RuntimeTypeModel.Default).Deserialize(type, source, instance, userState); } [Browsable(false)] [EditorBrowsable(EditorBrowsableState.Never)] public static object Merge(Stream source, object instance) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) if (instance == null) { throw new ArgumentNullException("instance"); } State val = State.Create(source, (TypeModel)(object)RuntimeTypeModel.Default, (object)null, -1L); try { return ((State)(ref val)).DeserializeRootFallback(instance, instance.GetType()); } finally { ((State)(ref val)).Dispose(); } } public static void SerializeWithLengthPrefix(Stream destination, object instance, PrefixStyle style, int fieldNumber) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) if (instance == null) { throw new ArgumentNullException("instance"); } ((TypeModel)RuntimeTypeModel.Default).SerializeWithLengthPrefix(destination, instance, instance.GetType(), style, fieldNumber); } public static bool TryDeserializeWithLengthPrefix(Stream source, PrefixStyle style, TypeResolver resolver, out object value) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) value = ((TypeModel)RuntimeTypeModel.Default).DeserializeWithLengthPrefix(source, (object)null, (Type)null, style, 0, resolver); return value != null; } public static bool CanSerialize(Type type) { return ((TypeModel)RuntimeTypeModel.Default).IsDefined(type); } public static void PrepareSerializer([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] Type type) { RuntimeTypeModel.Default[type].CompileInPlace(); } } public static class GlobalOptions { private static ProtoSyntax _defaultSyntax = (ProtoSyntax)1; [Obsolete("Please use RuntimeTypeModel.Default.InferTagFromNameDefault instead (or on a per-model basis)", false)] public static bool InferTagFromName { get { return RuntimeTypeModel.Default.InferTagFromNameDefault; } set { RuntimeTypeModel.Default.InferTagFromNameDefault = value; } } public static ProtoSyntax DefaultSyntax { get { //IL_0000: Unknown result type (might be due to invalid IL or missing references) return _defaultSyntax; } set { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) if ((int)value <= 1) { _defaultSyntax = value; } else { ThrowHelper.ThrowArgumentOutOfRangeException("DefaultSyntax"); } } } internal static ProtoSyntax Normalize(ProtoSyntax syntax) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Invalid comparison between Unknown and I4 //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) if ((int)syntax != 0) { if ((int)syntax == 1) { return syntax; } return DefaultSyntax; } return syntax; } } [Obsolete("Please use ProtoBuf.TypeResolver", true)] public delegate Type TypeResolver(int fieldNumber); private const string ProtoBinaryField = "proto"; public const int ListItemTag = 1; public static string GetProto<T>() { return ((TypeModel)RuntimeTypeModel.Default).GetSchema(typeof(T), (ProtoSyntax)(-1)); } public static string GetProto<T>(ProtoSyntax syntax) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) return ((TypeModel)RuntimeTypeModel.Default).GetSchema(typeof(T), syntax); } public static string GetProto(SchemaGenerationOptions options) { return ((TypeModel)RuntimeTypeModel.Default).GetSchema(options); } public static T DeepClone<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(T instance, SerializationContext context) { return ((TypeModel)RuntimeTypeModel.Default).DeepClone<T>(instance, (object)context); } public static T DeepClone<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(T instance, object userState = null) { return ((TypeModel)RuntimeTypeModel.Default).DeepClone<T>(instance, userState); } public static MeasureState<T> Measure<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(T value, object userState = null, long abortAfter = -1L) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) return ((TypeModel)RuntimeTypeModel.Default).Measure<T>(value, userState, abortAfter); } public static T Merge<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(Stream source, T instance) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) State val = State.Create(source, (TypeModel)(object)RuntimeTypeModel.Default, (object)null, -1L); try { return ((State)(ref val)).DeserializeRootImpl<T>(instance); } finally { ((State)(ref val)).Dispose(); } } public static TTo ChangeType<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] TFrom, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] TTo>(TFrom instance) { using MemoryStream memoryStream = new MemoryStream(); Serialize((Stream)memoryStream, instance); memoryStream.Position = 0L; return Deserialize<TTo>((Stream)memoryStream); } public static void Merge<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(XmlReader reader, T instance) where T : IXmlSerializable { if (reader == null) { throw new ArgumentNullException("reader"); } if (instance == null) { throw new ArgumentNullException("instance"); } byte[] buffer = new byte[4096]; using MemoryStream memoryStream = new MemoryStream(); int depth = reader.Depth; while (reader.Read() && reader.Depth > depth) { if (reader.NodeType == XmlNodeType.Text) { int count; while ((count = reader.ReadContentAsBase64(buffer, 0, 4096)) > 0) { memoryStream.Write(buffer, 0, count); } if (reader.Depth <= depth) { break; } } } memoryStream.Position = 0L; Merge(memoryStream, instance); } public static void Merge<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(SerializationInfo info, T instance) where T : class, ISerializable { Merge(info, new StreamingContext(StreamingContextStates.Persistence), instance); } public static void Merge<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(SerializationInfo info, StreamingContext context, T instance) where T : class, ISerializable { //IL_0096: Unknown result type (might be due to invalid IL or missing references) if (info == null) { throw new ArgumentNullException("info"); } if (instance == null) { throw new ArgumentNullException("instance"); } if (instance.GetType() != typeof(T)) { throw new ArgumentException("Incorrect type", "instance"); } byte[] buffer = (byte[])info.GetValue("proto", typeof(byte[])); using MemoryStream memoryStream = new MemoryStream(buffer); T val = ((TypeModel)RuntimeTypeModel.Default).Deserialize<T>((Stream)memoryStream, instance, context.Context); if (val != instance) { throw new ProtoException("Deserialization changed the instance; cannot succeed."); } } public static void PrepareSerializer<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>() { RuntimeTypeModel.Default[typeof(T)].CompileInPlace(); } public static IFormatter CreateFormatter<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>() { return ((TypeModel)RuntimeTypeModel.Default).CreateFormatter(typeof(T)); } public static IEnumerable<T> DeserializeItems<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(Stream source, PrefixStyle style, int fieldNumber) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) return ((TypeModel)RuntimeTypeModel.Default).DeserializeItems<T>(source, style, fieldNumber); } public static T DeserializeWithLengthPrefix<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(Stream source, PrefixStyle style) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return DeserializeWithLengthPrefix<T>(source, style, 0); } public static T DeserializeWithLengthPrefix<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(Stream source, PrefixStyle style, int fieldNumber) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) return (T)((TypeModel)RuntimeTypeModel.Default).DeserializeWithLengthPrefix(source, (object)null, typeof(T), style, fieldNumber); } public static T MergeWithLengthPrefix<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(Stream source, T instance, PrefixStyle style) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) return (T)((TypeModel)RuntimeTypeModel.Default).DeserializeWithLengthPrefix(source, (object)instance, typeof(T), style, 0); } public static bool TryReadLengthPrefix(Stream source, PrefixStyle style, out int length) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) int num = default(int); int num2 = default(int); length = ProtoReader.ReadLengthPrefix(source, false, style, ref num, ref num2); return num2 > 0; } public static bool TryReadLengthPrefix(byte[] buffer, int index, int count, PrefixStyle style, out int length) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) using Stream source = new MemoryStream(buffer, index, count); return TryReadLengthPrefix(source, style, out length); } [Obsolete("This API is no longer required and may be removed in a future release")] [Browsable(false)] [EditorBrowsable(EditorBrowsableState.Never)] public static void FlushPool() { } public static T Deserialize<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(Stream source) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) State val = State.Create(source, (TypeModel)(object)RuntimeTypeModel.Default, (object)null, -1L); try { return ((State)(ref val)).DeserializeRootImpl<T>(default(T)); } finally { ((State)(ref val)).Dispose(); } } public static T Deserialize<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(Stream source, T value, SerializationContext context, long length = -1L) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) State val = State.Create(source, (TypeModel)(object)RuntimeTypeModel.Default, (object)context, length); try { return ((State)(ref val)).DeserializeRootImpl<T>(value); } finally { ((State)(ref val)).Dispose(); } } public static T Deserialize<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(Stream source, T value = default(T), object userState = null, long length = -1L) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) State val = State.Create(source, (TypeModel)(object)RuntimeTypeModel.Default, userState, length); try { return ((State)(ref val)).DeserializeRootImpl<T>(value); } finally { ((State)(ref val)).Dispose(); } } public static object Deserialize([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] Type type, Stream source) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) State val = State.Create(source, (TypeModel)(object)RuntimeTypeModel.Default, (object)null, -1L); try { return ((State)(ref val)).DeserializeRootFallback((object)null, type); } finally { ((State)(ref val)).Dispose(); } } public static T Deserialize<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(ReadOnlyMemory<byte> source, T value = default(T), object userState = null) { return ((TypeModel)RuntimeTypeModel.Default).Deserialize<T>(source, value, userState); } public static T Deserialize<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(ReadOnlySequence<byte> source, T value = default(T), object userState = null) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) return ((TypeModel)RuntimeTypeModel.Default).Deserialize<T>(source, value, userState); } public static T Deserialize<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(ReadOnlySpan<byte> source, T value = default(T), object userState = null) { return ((TypeModel)RuntimeTypeModel.Default).Deserialize<T>(source, value, userState); } public static void Serialize<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(Stream destination, T instance) { Serialize(destination, instance, null); } public static void Serialize<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(Stream destination, T instance, object userState) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) State val = State.Create(destination, (TypeModel)(object)RuntimeTypeModel.Default, userState); try { TypeModel.SerializeImpl<T>(ref val, instance); } finally { ((State)(ref val)).Dispose(); } } public static void Serialize<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(IBufferWriter<byte> destination, T instance, object userState = null) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) State val = State.Create(destination, (TypeModel)(object)RuntimeTypeModel.Default, userState); try { TypeModel.SerializeImpl<T>(ref val, instance); } finally { ((State)(ref val)).Dispose(); } } public static void Serialize<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(SerializationInfo info, T instance) where T : class, ISerializable { Serialize(info, new StreamingContext(StreamingContextStates.Persistence), instance); } public static void Serialize<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(SerializationInfo info, StreamingContext context, T instance) where T : class, ISerializable { if (info == null) { throw new ArgumentNullException("info"); } if (instance == null) { throw new ArgumentNullException("instance"); } if (instance.GetType() != typeof(T)) { throw new ArgumentException("Incorrect type", "instance"); } using MemoryStream memoryStream = new MemoryStream(); ((TypeModel)RuntimeTypeModel.Default).Serialize<T>((Stream)memoryStream, instance, context.Context); info.AddValue("proto", memoryStream.ToArray()); } public static void Serialize<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(XmlWriter writer, T instance) where T : IXmlSerializable { if (writer == null) { throw new ArgumentNullException("writer"); } if (instance == null) { throw new ArgumentNullException("instance"); } using MemoryStream memoryStream = new MemoryStream(); Serialize((Stream)memoryStream, instance); ArraySegment<byte> arraySegment = default(ArraySegment<byte>); Helpers.GetBuffer(memoryStream, ref arraySegment); writer.WriteBase64(arraySegment.Array, arraySegment.Offset, arraySegment.Count); } public static void SerializeWithLengthPrefix<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(Stream destination, T instance, PrefixStyle style) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) SerializeWithLengthPrefix(destination, instance, style, 0); } public static void SerializeWithLengthPrefix<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T>(Stream destination, T instance, PrefixStyle style, int fieldNumber) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) ((TypeModel)RuntimeTypeModel.Default).SerializeWithLengthPrefix(destination, (object)instance, typeof(T), style, fieldNumber); } } } namespace ProtoBuf.Serializers { internal static class EnumSerializers { internal static object GetSerializer(Type type) { MemberInfo underlyingProvider = RuntimeTypeModel.GetUnderlyingProvider(GetProvider(type), type); if (!(underlyingProvider is FieldInfo fieldInfo)) { if (underlyingProvider is MethodInfo methodInfo) { return methodInfo.Invoke(null, null); } return null; } return fieldInfo.GetValue(null); } internal static MemberInfo GetProvider(Type type) { if ((object)type == null) { return null; } type = Nullable.GetUnderlyingType(type) ?? type; if (!type.IsEnum) { return null; } string text = Type.GetTypeCode(type) switch { TypeCode.SByte => "CreateSByte", TypeCode.Int16 => "CreateInt16", TypeCode.Int32 => "CreateInt32", TypeCode.Int64 => "CreateInt64", TypeCode.Byte => "CreateByte", TypeCode.UInt16 => "CreateUInt16", TypeCode.UInt32 => "CreateUInt32", TypeCode.UInt64 => "CreateUInt64", _ => null, }; if (text == null) { return null; } return typeof(EnumSerializer).GetMethod(text, BindingFlags.Static | BindingFlags.Public).MakeGenericMethod(type); } } internal static class RepeatedSerializers { [StructLayout(LayoutKind.Auto)] private readonly struct MethodTuple { public string Name => Method.Name; private MethodInfo Method { get; } public int GenericArgCount { get; } public MethodInfo Construct(Type[] targs) { if (GenericArgCount != 0) { return Method.MakeGenericMethod(targs); } return Method; } public MethodTuple(MethodInfo method) { Method = method; GenericArgCount = (method.IsGenericMethodDefinition ? method.GetGenericArguments().Length : 0); } } private sealed class Registration { public bool ExactOnly { get; } public int Priority { get; } private Func<Type, Type, Type[], MemberInfo> Implementation { get; } public MemberInfo Resolve(Type root, Type current) { Type[] arg = (current.IsGenericType ? current.GetGenericArguments() : ((!current.IsArray) ? Type.EmptyTypes : new Type[1] { current.GetElementType() })); return Implementation?.Invoke(root, current, arg); } public Registration(int priority, Func<Type, Type, Type[], MemberInfo> implementation, bool exactOnly) { Priority = priority; Implementation = implementation; ExactOnly = exactOnly; } } private static readonly Hashtable s_providers; private static readonly Hashtable s_methodsPerDeclaringType; private static readonly Hashtable s_knownTypes; private static readonly Registration s_Array; private static readonly Type[] NotSupportedFlavors; private static readonly MethodInfo s_NestedNotSupported; private static readonly MethodInfo s_GeneralNotSupported; internal static MemberInfo Resolve(Type declaringType, string methodName, Type[] targs) { if (targs == null) { targs = Type.EmptyTypes; } MethodTuple[] array = (MethodTuple[])s_methodsPerDeclaringType[declaringType]; if (array == null) { MethodInfo[] methods = declaringType.GetMethods(BindingFlags.Static | BindingFlags.Public); array = Array.ConvertAll(methods, (MethodInfo m) => new MethodTuple(m)); lock (s_methodsPerDeclaringType) { s_methodsPerDeclaringType[declaringType] = array; } } MethodTuple[] array2 = array; for (int i = 0; i < array2.Length; i++) { MethodTuple methodTuple = array2[i]; if (methodTuple.Name == methodName && targs.Length == methodTuple.GenericArgCount) { return methodTuple.Construct(targs); } } return null; } static RepeatedSerializers() { s_methodsPerDeclaringType = new Hashtable(); s_knownTypes = new Hashtable(); s_Array = new Registration(0, (Type root, Type current, Type[] targs) => (!(root == current)) ? null : Resolve(typeof(RepeatedSerializer), "CreateVector", targs), exactOnly: true); NotSupportedFlavors = new Type[7] { typeof(Span<>), typeof(ReadOnlySpan<>), typeof(ReadOnlySequence<>), typeof(ReadOnlyMemory<>), typeof(Memory<>), typeof(ArraySegment<>), typeof(IMemoryOwner<>) }; s_NestedNotSupported = typeof(RepeatedSerializer).GetMethod("CreateNestedDataNotSupported"); s_GeneralNotSupported = typeof(RepeatedSerializer).GetMethod("CreateNotSupported"); s_providers = new Hashtable(); Add(typeof(List<>), (Type root, Type current, Type[] targs) => Resolve(typeof(RepeatedSerializer), "CreateList", (root == current) ? targs : new Type[2] { root, targs[0] }), exactOnly: false); Add(typeof(ImmutableArray<>), (Type root, Type current, Type[] targs) => Resolve(typeof(RepeatedSerializer), "CreateImmutableArray", targs)); Add(typeof(ImmutableDictionary<, >), (Type root, Type current, Type[] targs) => Resolve(typeof(MapSerializer), "CreateImmutableDictionary", targs)); Add(typeof(ImmutableSortedDictionary<, >), (Type root, Type current, Type[] targs) => Resolve(typeof(MapSerializer), "CreateImmutableSortedDictionary", targs)); Add(typeof(IImmutableDictionary<, >), (Type root, Type current, Type[] targs) => Resolve(typeof(MapSerializer), "CreateIImmutableDictionary", targs)); Add(typeof(ImmutableList<>), (Type root, Type current, Type[] targs) => Resolve(typeof(RepeatedSerializer), "CreateImmutableList", targs)); Add(typeof(IImmutableList<>), (Type root, Type current, Type[] targs) => Resolve(typeof(RepeatedSerializer), "CreateImmutableIList", targs)); Add(typeof(ImmutableHashSet<>), (Type root, Type current, Type[] targs) => Resolve(typeof(RepeatedSerializer), "CreateImmutableHashSet", targs)); Add(typeof(ImmutableSortedSet<>), (Type root, Type current, Type[] targs) => Resolve(typeof(RepeatedSerializer), "CreateImmutableSortedSet", targs)); Add(typeof(IImmutableSet<>), (Type root, Type current, Type[] targs) => Resolve(typeof(RepeatedSerializer), "CreateImmutableISet", targs)); Add(typeof(ImmutableQueue<>), (Type root, Type current, Type[] targs) => Resolve(typeof(RepeatedSerializer), "CreateImmutableQueue", targs)); Add(typeof(IImmutableQueue<>), (Type root, Type current, Type[] targs) => Resolve(typeof(RepeatedSerializer), "CreateImmutableIQueue", targs)); Add(typeof(ImmutableStack<>), (Type root, Type current, Type[] targs) => Resolve(typeof(RepeatedSerializer), "CreateImmutableStack", targs)); Add(typeof(IImmutableStack<>), (Type root, Type current, Type[] targs) => Resolve(typeof(RepeatedSerializer), "CreateImmutableIStack", targs)); Add(typeof(ConcurrentDictionary<, >), (Type root, Type current, Type[] targs) => Resolve(typeof(MapSerializer), "CreateConcurrentDictionary", new Type[3] { root, targs[0], targs[1] }), exactOnly: false); Add(typeof(ConcurrentBag<>), (Type root, Type current, Type[] targs) => Resolve(typeof(RepeatedSerializer), "CreateConcurrentBag", new Type[2] { root, targs[0] }), exactOnly: false); Add(typeof(ConcurrentQueue<>), (Type root, Type current, Type[] targs) => Resolve(typeof(RepeatedSerializer), "CreateConcurrentQueue", new Type[2] { root, targs[0] }), exactOnly: false); Add(typeof(ConcurrentStack<>), (Type root, Type current, Type[] targs) => Resolve(typeof(RepeatedSerializer), "CreateConcurrentStack", new Type[2] { root, targs[0] }), exactOnly: false); Add(typeof(IProducerConsumerCollection<>), (Type root, Type current, Type[] targs) => Resolve(typeof(RepeatedSerializer), "CreateIProducerConsumerCollection", new Type[2] { root, targs[0] }), exactOnly: false); Add(typeof(Dictionary<, >), (Type root, Type current, Type[] targs) => Resolve(typeof(MapSerializer), "CreateDictionary", (root == current) ? targs : new Type[3] { root, targs[0], targs[1] }), exactOnly: false); Add(typeof(IDictionary<, >), (Type root, Type current, Type[] targs) => Resolve(typeof(MapSerializer), "CreateDictionary", new Type[3] { root, targs[0], targs[1] }), exactOnly: false); Add(typeof(IReadOnlyDictionary<, >), (Type root, Type current, Type[] targs) => Resolve(typeof(MapSerializer), "CreateIReadOnlyDictionary", targs)); Add(typeof(Queue<>), (Type root, Type current, Type[] targs) => Resolve(typeof(RepeatedSerializer), "CreateQueue", new Type[2] { root, targs[0] }), exactOnly: false); Add(typeof(Stack<>), (Type root, Type current, Type[] targs) => Resolve(typeof(RepeatedSerializer), "CreateStack", new Type[2] { root, targs[0] }), exactOnly: false); Add(typeof(IEnumerable<>), (Type root, Type current, Type[] targs) => Resolve(typeof(RepeatedSerializer), "CreateEnumerable", new Type[2] { root, targs[0] }), exactOnly: false); } public static void Add(Type type, Func<Type, Type, Type[], MemberInfo> implementation, bool exactOnly = true, Hashtable externalProviders = null) { Hashtable hashtable = ((externalProviders == null) ? s_providers : externalProviders); if ((object)type == null) { ThrowHelper.ThrowArgumentNullException("type"); } lock (hashtable) { Registration value = new Registration(s_providers.Count * ((externalProviders == null) ? 1 : (-1)) + 1, implementation, exactOnly); hashtable.Add(type, value); } lock (s_knownTypes) { s_knownTypes.Clear(); } } internal static RepeatedSerializerStub TryGetRepeatedProvider(Type type, Hashtable externalProvders = null) { if ((object)type == null || type == typeof(string)) { return null; } RepeatedSerializerStub repeatedSerializerStub = (RepeatedSerializerStub)s_knownTypes[type]; if (repeatedSerializerStub == null) { Type genericTypeDefinition; if (!TypeHelper.IsBytesLike(type) && type.IsGenericType && Array.IndexOf(NotSupportedFlavors, genericTypeDefinition = type.GetGenericTypeDefinition()) >= 0) { if (genericTypeDefinition == typeof(Span<>) || genericTypeDefinition == typeof(ReadOnlySpan<>)) { throw new NotSupportedException("Serialization cannot work with [ReadOnly]Span<T>; [ReadOnly]Memory<T> may be enabled later"); } repeatedSerializerStub = NotSupported(s_GeneralNotSupported, type, type.GetGenericArguments()[0]); } else { MemberInfo providerForType = GetProviderForType(type, externalProvders); if ((object)providerForType == null) { repeatedSerializerStub = ((!type.IsArray || !(type != typeof(byte[]))) ? RepeatedSerializerStub.Empty : NotSupported(s_GeneralNotSupported, type, type.GetElementType())); } else { repeatedSerializerStub = RepeatedSerializerStub.Create(type, providerForType); if (TestIfNestedNotSupported(repeatedSerializerStub)) { repeatedSerializerStub = NotSupported(s_NestedNotSupported, repeatedSerializerStub.ForType, repeatedSerializerStub.ItemType); } } } lock (s_knownTypes) { s_knownTypes[type] = repeatedSerializerStub; } } if (!repeatedSerializerStub.IsEmpty) { return repeatedSerializerStub; } return null; } [MethodImpl(MethodImplOptions.NoInlining)] internal static RepeatedSerializerStub NotSupported(MethodInfo kind, Type collectionType, Type itemType) { return RepeatedSerializerStub.Create(collectionType, kind.MakeGenericMethod(collectionType, itemType)); } private static bool TestIfNestedNotSupported(RepeatedSerializerStub repeated) { if ((object)repeated?.ItemType == null) { return false; } if (!repeated.IsMap && (repeated.ItemType == repeated.ForType || TryGetRepeatedProvider(repeated.ItemType) != null)) { return true; } return false; } private static MemberInfo GetProviderForType(Type type, Hashtable externalProviders) { if ((object)type == null) { return null; } if (TypeHelper.IsBytesLike(type)) { return null; } if (type.IsArray) { Type type2 = type.GetElementType().MakeArrayType(); if (!(type2 == type)) { return null; } return s_Array.Resolve(type, type2); } MemberInfo bestMatch = null; int bestMatchPriority = int.MaxValue; bool bestIsAmbiguous = false; Type type3 = type; if (externalProviders != null) { while ((object)type3 != null && type3 != typeof(object)) { if (TryGetExternalProvider(type, type3, bestMatchPriority, out var member2, out var priority2, externalProviders)) { Consider(member2, priority2); } type3 = type3.BaseType; } Type[] interfaces = type.GetInterfaces(); foreach (Type current in interfaces) { if (TryGetExternalProvider(type, current, bestMatchPriority, out var member3, out var priority3, externalProviders)) { Consider(member3, priority3); } } } type3 = type; while ((object)type3 != null && type3 != typeof(object)) { if (TryGetProvider(type, type3, bestMatchPriority, out var member4, out var priority4)) { Consider(member4, priority4); } type3 = type3.BaseType; } Type[] interfaces2 = type.GetInterfaces(); foreach (Type current2 in interfaces2) { if (TryGetProvider(type, current2, bestMatchPriority, out var member5, out var priority5)) { Consider(member5, priority5); } } if (!bestIsAmbiguous) { return bestMatch; } return null; void Consider(MemberInfo member, int priority) { if (priority < bestMatchPriority) { bestMatch = member; bestMatchPriority = priority; bestIsAmbiguous = false; } else if (priority == bestMatchPriority && !object.Equals(bestMatch, member)) { bestIsAmbiguous = true; } } } private static bool TryGetProvider(Type root, Type current, int bestMatchPriority, out MemberInfo member, out int priority) { Registration registration = (Registration)s_providers[current]; if (registration == null && current.IsGenericType) { registration = (Registration)s_providers[current.GetGenericTypeDefinition()]; } if (registration == null || registration.Priority > bestMatchPriority || (registration.ExactOnly && root != current)) { member = null; priority = 0; return false; } member = registration.Resolve(root, current); priority = registration.Priority; return true; } private static bool TryGetExternalProvider(Type root, Type current, int bestMatchPriority, out MemberInfo member, out int priority, Hashtable externalProviders) { Registration registration = (Registration)externalProviders[current]; if (registration == null && current.IsGenericType) { registration = (Registration)externalProviders[current.GetGenericTypeDefinition()]; } if (registration == null || registration.Priority > bestMatchPriority || (registration.ExactOnly && root != current)) { member = null; priority = 0; return false; } member = registration.Resolve(root, current); priority = registration.Priority; return true; } } internal sealed class RepeatedSerializerStub { internal static readonly RepeatedSerializerStub Empty = new RepeatedSerializerStub(null, null); private object _serializer; public MemberInfo Provider { get; } public bool IsMap { get; } public bool IsEmpty => (object)Provider == null; public object Serializer => _serializer ?? CreateSerializer(); public Type ForType { get; } public Type ItemType { get; } internal bool IsValidProtobufMap(RuntimeTypeModel model, CompatibilityLevel compatibilityLevel, DataFormat dataFormat) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) if (!IsMap) { return false; } ResolveMapTypes(out var keyType, out var valueType); if (!IsValidKey(keyType, compatibilityLevel, dataFormat)) { return false; } RepeatedSerializerStub repeatedSerializerStub = ((model == null) ? RepeatedSerializers.TryGetRepeatedProvider(valueType) : model.TryGetRepeatedProvider(valueType, (CompatibilityLevel)0)); if (repeatedSerializerStub != null) { return false; } return true; static bool IsValidKey(Type type, CompatibilityLevel compatibilityLevel, DataFormat dataFormat) { //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Invalid comparison between Unknown and I4 //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Invalid comparison between Unknown and I4 if ((object)type == null) { return false; } if (type.IsEnum) { return true; } if (type == typeof(string)) { return true; } if (!type.IsValueType) { return false; } if ((object)Nullable.GetUnderlyingType(type) != null) { return false; } TypeCode typeCode = Type.GetTypeCode(type); if ((uint)(typeCode - 5) <= 7u) { return true; } if ((int)compatibilityLevel >= 300 && type == typeof(Guid) && (int)dataFormat != 3) { return true; } return false; } } [MethodImpl(MethodImplOptions.NoInlining)] private object CreateSerializer() { try { MemberInfo underlyingProvider = RuntimeTypeModel.GetUnderlyingProvider(Provider, ForType); object serializer; if (!(underlyingProvider is FieldInfo fieldInfo)) { if (!(underlyingProvider is MethodInfo methodInfo) || !methodInfo.IsStatic) { goto IL_004d; } serializer = methodInfo.Invoke(null, null); } else { if (!fieldInfo.IsStatic) { goto IL_004d; } serializer = fieldInfo.GetValue(null); } goto IL_004f; IL_004d: serializer = null; goto IL_004f; IL_004f: _serializer = serializer; return _serializer; } catch (TargetInvocationException ex) when (ex.InnerException != null) { throw ex.InnerException; } } internal void EmitProvider(CompilerContext ctx) { EmitProvider(ctx.IL); } private void EmitProvider(ILGenerator il) { MemberInfo underlyingProvider = RuntimeTypeModel.GetUnderlyingProvider(Provider, ForType); RuntimeTypeModel.EmitProvider(underlyingProvider, il); } public static RepeatedSerializerStub Create(Type forType, MemberInfo provider) { if ((object)provider != null) { return new RepeatedSerializerStub(forType, provider); } return Empty; } private RepeatedSerializerStub(Type forType, MemberInfo provider) { ForType = forType; Provider = provider; IsMap = CheckIsMap(provider, out var itemType); ItemType = itemType; } private static bool CheckIsMap(MemberInfo provider, out Type itemType) { Type type2 = ((provider is MethodInfo methodInfo) ? methodInfo.ReturnType : ((provider is FieldInfo fieldInfo) ? fieldInfo.FieldType : ((provider is PropertyInfo propertyInfo) ? propertyInfo.PropertyType : ((!(provider is Type type)) ? null : type)))); Type type3 = type2; while ((object)type3 != null && type3 != typeof(object)) { if (type3.IsGenericType) { Type genericTypeDefinition = type3.GetGenericTypeDefinition(); if (genericTypeDefinition == typeof(MapSerializer<, , >)) { Type[] genericArguments = type3.GetGenericArguments(); itemType = typeof(KeyValuePair<, >).MakeGenericType(genericArguments[1], genericArguments[2]); return true; } if (genericTypeDefinition == typeof(RepeatedSerializer<, >)) { Type[] genericArguments2 = type3.GetGenericArguments(); itemType = genericArguments2[1]; return false; } } type3 = type3.BaseType; } itemType = null; return false; } internal void ResolveMapTypes(out Type keyType, out Type valueType) { keyType = (valueType = null); if (IsMap) { Type[] genericArguments = ItemType.GetGenericArguments(); keyType = genericArguments[0]; valueType = genericArguments[1]; } } } } namespace ProtoBuf.Meta { internal abstract class AttributeMap { private sealed class ReflectionAttributeMap : AttributeMap { private readonly Attribute attribute; public override object Target => attribute; public override Type AttributeType => attribute.GetType(); public ReflectionAttributeMap(Attribute attribute) { this.attribute = attribute; } public override bool TryGet(string key, bool publicOnly, out object value) { MemberInfo[] instanceFieldsAndProperties = Helpers.GetInstanceFieldsAndProperties(attribute.GetType(), publicOnly); MemberInfo[] array = instanceFieldsAndProperties; foreach (MemberInfo memberInfo in array) { if (string.Equals(memberInfo.Name, key, StringComparison.OrdinalIgnoreCase)) { if (memberInfo is PropertyInfo propertyInfo) { value = propertyInfo.GetValue(attribute, null); return true; } if (memberInfo is FieldInfo fieldInfo) { value = fieldInfo.GetValue(attribute); return true; } throw new NotSupportedException(memberInfo.GetType().Name); } } value = null; return false; } } public abstract Type AttributeType { get; } public abstract object Target { get; } [Obsolete("Please use AttributeType instead")] public new Type GetType() { return AttributeType; } public override string ToString() { return AttributeType?.FullName ?? ""; } public abstract bool TryGet(string key, bool publicOnly, out object value); public bool TryGet(string key, out object value) { return TryGet(key, publicOnly: true, out value); } public static AttributeMap[] Create(Type type, bool inherit) { object[] customAttributes = type.GetCustomAttributes(inherit); AttributeMap[] array = new AttributeMap[customAttributes.Length]; for (int i = 0; i < customAttributes.Length; i++) { array[i] = new ReflectionAttributeMap((Attribute)customAttributes[i]); } return array; } public static AttributeMap[] Create(MemberInfo member, bool inherit) { object[] customAttributes = member.GetCustomAttributes(inherit); AttributeMap[] array = new AttributeMap[customAttributes.Length]; for (int i = 0; i < customAttributes.Length; i++) { array[i] = new ReflectionAttributeMap((Attribute)customAttributes[i]); } return array; } public static AttributeMap[] Create(Assembly assembly) { object[] customAttributes = assembly.GetCustomAttributes(inherit: false); AttributeMap[] array = new AttributeMap[customAttributes.Length]; for (int i = 0; i < customAttributes.Length; i++) { array[i] = new ReflectionAttributeMap((Attribute)customAttributes[i]); } return array; } } public sealed class AutoCompileTypeModel : TypeModel { private static readonly Hashtable s_assemblyModels = new Hashtable(); public static TypeModel Instance { get; } = (TypeModel)(object)new AutoCompileTypeModel(); public static TypeModel CreateForAssembly<T>() { return CreateForAssembly(typeof(T).Assembly, null); } public static TypeModel CreateForAssembly(Type type) { if ((object)type == null) { ThrowHelper.ThrowArgumentNullException("type"); } return CreateForAssembly(type.Assembly, null); } public static TypeModel CreateForAssembly(Assembly assembly) { return CreateForAssembly(assembly, null); } public static TypeModel CreateForAssembly(Assembly assembly, RuntimeTypeModel.CompilerOptions options) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown if ((object)assembly == null) { ThrowHelper.ThrowArgumentNullException("assembly"); } if (options == null) { TypeModel val = (TypeModel)s_assemblyModels[assembly]; if (val != null) { return val; } } return CreateForAssemblyImpl(assembly, options); } private AutoCompileTypeModel() { } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static TypeModel ForAssembly(Type type) { if ((object)type != null) { return CreateForAssembly(type.Assembly, null); } return NullModel.Singleton; } public override string GetSchema(SchemaGenerationOptions options) { return ForAssembly(options.HasTypes ? options.Types.First() : null).GetSchema(options); } protected override ISerializer<T> GetSerializer<T>() { return ForAssembly(typeof(T)).GetSerializerCore<T>((CompatibilityLevel)0); } internal override bool IsKnownType<T>(CompatibilityLevel ambient) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) return ForAssembly(typeof(T)).IsKnownType<T>(ambient); } private static TypeModel CreateForAssemblyImpl(Assembly assembly, RuntimeTypeModel.CompilerOptions options) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown if ((object)assembly == null) { throw new ArgumentNullException("assembly"); } lock (assembly) { TypeModel val = (TypeModel)s_assemblyModels[assembly]; if (val != null) { return val; } RuntimeTypeModel runtimeTypeModel = null; Type[] types = assembly.GetTypes(); foreach (Type type in types) { if (!type.IsGenericTypeDefinition && RuntimeTypeModel.IsFullyPublic(type) && type.IsDefined(typeof(ProtoContractAttribute), inherit: true) && (options == null || options.OnIncludeType(type))) { (runtimeTypeModel ?? (runtimeTypeModel = RuntimeTypeModel.Create("CreateForAssemblyImpl"))).Add(type, applyDefaultBehaviour: true); } } if (runtimeTypeModel == null) { throw new InvalidOperationException("No types marked [ProtoContract] found in assembly '" + assembly.GetName().Name + "'"); } TypeModel val2 = runtimeTypeModel.Compile(options); s_assemblyModels[assembly] = val2; return val2; } } } public class CallbackSet { private readonly MetaType metaType; private MethodInfo beforeSerialize; private MethodInfo afterSerialize; private MethodInfo beforeDeserialize; private MethodInfo afterDeserialize; internal MethodInfo this[CallbackType callbackType] => (int)callbackType switch { 0 => beforeSerialize, 1 => afterSerialize, 2 => beforeDeserialize, 3 => afterDeserialize, _ => throw new ArgumentException("Callback type not supported: " + ((object)(CallbackType)(ref callbackType)).ToString(), "callbackType"), }; public MethodInfo BeforeSerialize { get { return beforeSerialize; } set { beforeSerialize = SanityCheckCallback(value); } } public MethodInfo BeforeDeserialize { get { return beforeDeserialize; } set { beforeDeserialize = SanityCheckCallback(value); } } public MethodInfo AfterSerialize { get { return afterSerialize; } set { afterSerialize = SanityCheckCallback(value); } } public MethodInfo AfterDeserialize { get { return afterDeserialize; } set { afterDeserialize = SanityCheckCallback(value); } } public bool NonTrivial { get { if ((object)beforeSerialize == null && (object)beforeDeserialize == null && (object)afterSerialize == null) { return (object)afterDeserialize != null; } return true; } } internal CallbackSet(MetaType metaType) { this.metaType = metaType ?? throw new ArgumentNullException("metaType"); } internal static bool CheckCallbackParameters(MethodInfo method) { ParameterInfo[] parameters = method.GetParameters(); for (int i = 0; i < parameters.Length; i++) { Type parameterType = parameters[i].ParameterType; if (!(parameterType == typeof(SerializationContext)) && !(parameterType == typeof(Type)) && !(parameterType == typeof(StreamingContext))) { return false; } } return true; } private MethodInfo SanityCheckCallback(MethodInfo callback) { metaType.ThrowIfFrozen(); if ((object)callback == null) { return callback; } if (callback.IsStatic) { throw new ArgumentException("Callbacks cannot be static", "callback"); } if (callback.ReturnType != typeof(void) || !CheckCallbackParameters(callback)) { throw CreateInvalidCallbackSignature(callback); } return callback; } internal static Exception CreateInvalidCallbackSignature(MethodInfo method) { return new NotSupportedException("Invalid callback signature in " + method.DeclaringType.FullName + "." + method.Name); } } [StructLayout(LayoutKind.Auto)] public readonly struct EnumMember : IEquatable<EnumMember> { public string Name { get; } public object Value { get; } internal bool HasValue { get { if (Value != null) { return !string.IsNullOrWhiteSpace(Name); } return false; } } public EnumMember(object value, string name) { Name = name; Value = value; } internal int? TryGetInt32() { return TryGetInt32(Value); } internal static int? TryGetInt32(object value) { if (value != null) { Type type = value.GetType(); if (type.IsEnum) { type = Enum.GetUnderlyingType(type); } switch (Type.GetTypeCode(type)) { case TypeCode.SByte: return (sbyte)value; case TypeCode.Int16: return (short)value; case TypeCode.Int32: return (int)value; case TypeCode.Byte: return (byte)value; case TypeCode.UInt16: return (ushort)value; case TypeCode.UInt32: { uint num3 = (uint)value; if (num3 <= int.MaxValue) { return (int)num3; } break; } case TypeCode.UInt64: { ulong num2 = (ulong)value; if (num2 <= int.MaxValue) { return (int)num2; } break; } case TypeCode.Int64: { long num = (long)value; if (num >= int.MinValue && num <= int.MaxValue) { return (int)num; } break; } } } return null; } public EnumMember WithName(string name) { return new EnumMember(Value, name); } public EnumMember WithValue(object value) { return new EnumMember(value, Name); } public EnumMember Normalize(Type type) { return WithValue(Normalize(Value, type)); } public bool Equals<T>(T value) where T : unmanaged { return object.Equals(Normalize(Value, typeof(T)), Normalize(value, typeof(T))); } public override string ToString() { return $"{Name}={Value}"; } public override int GetHashCode() { return (Name?.GetHashCode() ?? 0) ^ (Value?.GetHashCode() ?? 0); } public override bool Equals(object obj) { if (obj is EnumMember other) { return Equals(other); } return false; } public bool Equals(EnumMember other) { if (string.Equals(Name, other.Name)) { return object.Equals(Value, other.Value); } return false; } public static bool operator ==(EnumMember x, EnumMember y) { return x.Equals(y); } public static bool operator !=(EnumMember x, EnumMember y) { return !x.Equals(y); } private static object Normalize(object value, Type type) { return Convert.ChangeType(value, type.IsEnum ? Enum.GetUnderlyingType(type) : type); } public static EnumMember Create<T>(T value) where T : unmanaged { return new EnumMember(value, value.ToString()).Normalize(typeof(T)); } internal void Validate() { if (string.IsNullOrWhiteSpace(Name)) { ThrowHelper.ThrowInvalidOperationException("All enum declarations must have valid names", (Exception)null); } } } public sealed class MetaType : ISerializerProxy { internal sealed class Comparer : IComparer, IComparer<MetaType> { private readonly HashSet<Type> _callstack; internal Comparer(HashSet<Type> callstack) { _callstack = callstack; } public int Compare(object x, object y) { return Compare(x as MetaType, y as MetaType); } public int Compare(MetaType x, MetaType y) { if (x == y) { return 0; } if (x == null) { return -1; } if (y == null) { return 1; } return string.Compare(x.GetSchemaTypeName(_callstack), y.GetSchemaTypeName(_callstack), StringComparison.Ordinal); } } [Flags] internal enum AttributeFamily { None = 0, ProtoBuf = 1, DataContractSerializer = 2, XmlSerializer = 4, AutoTuple = 8 } private enum TypeOptions : ushort { None = 0, Pending = 1, Frozen = 4, PrivateOnApi = 8, SkipConstructor = 0x10, AutoTuple = 0x40, IgnoreListHandling = 0x80, IsGroup = 0x100, IgnoreUnknownSubTypes = 0x200 } private class ExtraLayerValueMembers : IEnumerable<NullWrappedValueMemberData>, IEnumerable { private readonly Dictionary<string, Type> _schemaMemberTypeMap = new Dictionary<string, Type>(); private readonly Dictionary<string, NullWrappedValueMemberData> _wrappedSchemaMembers = new Dictionary<string, NullWrappedValueMemberData>(); public bool IsEmpty() { return _wrappedSchemaMembers.Count == 0; } public NullWrappedValueMemberData Add(string schemaTypeName, ValueMember valueMember) { if (!_schemaMemberTypeMap.ContainsKey(schemaTypeName)) { NullWrappedValueMemberData nullWrappedValueMemberData = new NullWrappedValueMemberData(valueMember, schemaTypeName); _schemaMemberTypeMap[schemaTypeName] = nullWrappedValueMemberData.ItemType; _wrappedSchemaMembers[nullWrappedValueMemberData.WrappedSchemaTypeName] = nullWrappedValueMemberData; return nullWrappedValueMemberData; } Type type = _schemaMemberTypeMap[schemaTypeName]; if (type == valueMember.ItemType) { NullWrappedValueMemberData nullWrappedValueMemberData2 = new NullWrappedValueMemberData(valueMember, schemaTypeName); _wrappedSchemaMembers[nullWrappedValueMemberData2.WrappedSchemaTypeName] = nullWrappedValueMemberData2; return nullWrappedValueMemberData2; } if (string.IsNullOrEmpty(valueMember.Name) || valueMember.Member?.Name == valueMember.Name) { NullWrappedValueMemberData nullWrappedValueMemberData3 = new NullWrappedValueMemberData(valueMember, schemaTypeName, null, hasSchemaTypeNameCollision: true); _wrappedSchemaMembers[nullWrappedValueMemberData3.WrappedSchemaTypeName] = nullWrappedValueMemberData3; return nullWrappedValueMemberData3; } string name = valueMember.Name; if (_schemaMemberTypeMap.ContainsKey(name)) { NullWrappedValueMemberData nullWrappedValueMemberData4 = new NullWrappedValueMemberData(valueMember, schemaTypeName, name, hasSchemaTypeNameCollision: true); _wrappedSchemaMembers[nullWrappedValueMemberData4.WrappedSchemaTypeName] = nullWrappedValueMemberData4; return nullWrappedValueMemberData4; } NullWrappedValueMemberData nullWrappedValueMemberData5 = new NullWrappedValueMemberData(valueMember, schemaTypeName, name); _schemaMemberTypeMap[name] = nullWrappedValueMemberData5.ItemType; _wrappedSchemaMembers[nullWrappedValueMemberData5.WrappedSchemaTypeName] = nullWrappedValueMemberData5; return nullWrappedValueMemberData5; } public IEnumerator<NullWrappedValueMemberData> GetEnumerator() { return _wrappedSchemaMembers.Values.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } private MetaType baseType; private CompatibilityLevel _compatibilityLevel; private List<SubType> _subTypes; private CallbackSet callbacks; private string name; private string origin; private MethodInfo factory; private readonly RuntimeTypeModel model; private IProtoTypeSerializer _serializer; private Type constructType; internal Type surrogateType; internal DataFormat surrogateDataFormat; private MethodInfo underlyingToSurrogate; private MethodInfo surrogateToUnderlying; private List<ValueMember> _fields; private List<EnumMember> _enums = new List<EnumMember>(); private volatile TypeOptions flags; private Type _serializerType; private List<ProtoReservedAttribute> _reservations; IRuntimeProtoSerializerNode ISerializerProxy.Serializer => Serializer; public MetaType BaseType => baseType; internal RuntimeTypeModel Model => model; public CompatibilityLevel CompatibilityLevel { get { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return _compatibilityLevel; } set { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) if (value != _compatibilityLevel) { if (HasFields) { ThrowHelper.ThrowInvalidOperationException($"{CompatibilityLevel} cannot be set once fields have been defined", (Exception)null); } CompatibilityLevelAttribute.AssertValid(value); _compatibilityLevel = value; } } } public bool IncludeSerializerMethod { get { return !HasFlag(TypeOptions.PrivateOnApi); } set { SetFlag(TypeOptions.PrivateOnApi, !value, throwIfFrozen: true); } } public bool AsReferenceDefault { get { return false; } [Obsolete("Reference-tracking and dynamic-type are not currently implemented in this build; they may be reinstated later; this is partly due to doubts over whether the features are adviseable, and partly over confidence in testing all the scenarios (it takes time; that time hasn't get happened); feedback is invited", true)] set { if (value != AsReferenceDefault) { ThrowHelper.ThrowNotSupportedException(); } } } public bool HasCallbacks { get { if (callbacks != null) { return callbacks.NonTrivial; } return false; } } public bool HasSubtypes { get { if (_subTypes != null) { return _subTypes.Count != 0; } return false; } } public CallbackSet Callbacks => callbacks ?? (callbacks = new CallbackSet(this)); private bool IsValueType => Type.IsValueType; public string Name { get { return name; } set { ThrowIfFrozen(); name = value; } } public string Origin { get { return origin; } set { ThrowIfFrozen(); origin = value; } } public Type Type { get; } internal IProtoTypeSerializer Serializer { get { if (_serializer == null) { int opaqueToken = 0; try { model.TakeLock(ref opaqueToken); if (_serializer == null) { SetFlag(TypeOptions.Frozen, value: true, throwIfFrozen: false); _serializer = BuildSerializer(); if (model.AutoCompile) { CompileInPlace(); } } } finally { model.ReleaseLock(opaqueToken); } } return _serializer; } } public bool UseConstructor { get { return !HasFlag(TypeOptions.SkipConstructor); } set { SetFlag(TypeOptions.SkipConstructor, !value, throwIfFrozen: true); } } public Type ConstructType { get { return constructType; } set { ThrowIfFrozen(); constructType = value; } } internal bool HasSurrogate => (object)surrogateType != null; public ValueMember this[int fieldNumber] { get { if (HasFields) { foreach (ValueMember field in Fields) { if (field.FieldNumber == fieldNumber) { return field; } } } return null; } } public ValueMember this[MemberInfo member] { get { if ((object)member == null || !HasFields) { return null; } foreach (ValueMember field in Fields) { if (field.Member == member || field.BackingMember == member) { return field; } } return null; } } internal bool HasFields { get { if (_fields != null) { return _fields.Count != 0; } return false; } } internal List<ValueMember> Fields => _fields ?? (_fields = new List<ValueMember>()); internal List<EnumMember> Enums => _enums ?? (_enums = new List<EnumMember>()); internal bool HasEnums { get { if (_enums != null) { return _enums.Count != 0; } return false; } } public bool EnumPassthru { [Obsolete("Enum value maps have been deprecated and are no longer supported; all enums are now effectively pass-thru; custom maps should be applied via shadow properties; in C#, lambda-based 'switch expressions' make for very convenient shadow properties", false)] get { return Type.IsEnum; } [Obsolete("Enum value maps have been deprecated and are no longer supported; all enums are now effectively pass-thru; custom maps should be applied via shadow properties; in C#, lambda-based 'switch expressions' make for very convenient shadow properties", true)] set { if (value != EnumPassthru) { ThrowHelper.ThrowNotSupportedException(); } } } public bool IgnoreListHandling { get { return HasFlag(TypeOptions.IgnoreListHandling); } set { SetFlag(TypeOptions.IgnoreListHandling, value, throwIfFrozen: true); model.ResetServiceCache(Type); } } public bool IgnoreUnknownSubTypes { get { return HasFlag(TypeOptions.IgnoreUnknownSubTypes); } set { SetFlag(TypeOptions.IgnoreUnknownSubTypes, value, throwIfFrozen: true); } } internal bool Pending { get { return HasFlag(TypeOptions.Pending); } set { SetFlag(TypeOptions.Pending, value, throwIfFrozen: false); } } public Type SerializerType { get { return _serializerType; } set { if (value != _serializerType) { if (!value.IsClass) { ThrowHelper.ThrowArgumentException("Custom serializer providers must be classes", "SerializerType"); } ThrowIfFrozen(); _serializerType = value; } } } internal bool IsAutoTuple => HasFlag(TypeOptions.AutoTuple); public bool IsGroup { get { return HasFlag(TypeOptions.IsGroup); } set { SetFlag(TypeOptions.IsGroup, value, throwIfFrozen: true); } } internal bool HasReservations => (_reservations?.Count ?? 0) != 0; public override string ToString() { return Type.ToString(); } private bool IsValidSubType(Type subType) { if ((object)subType != null && !subType.IsValueType) { return Type.IsAssignableFrom(subType); } return false; } public MetaType AddSubType(int fieldNumber, Type derivedType) { return AddSubType(fieldNumber, derivedType, (DataFormat)0); } private static void ThrowSubTypeWithSurrogate(Type type) { ThrowHelper.ThrowInvalidOperationException("Types with surrogates cannot be used in inheritance hierarchies: " + TypeHelper.NormalizeName(type), (Exception)null); } public MetaType AddSubType(int fieldNumber, Type derivedType, DataFormat dataFormat) { //IL_00ef: Unknown result type (might be due to invalid IL or missing references) if ((object)derivedType == null) { throw new ArgumentNullException("derivedType"); } if (fieldNumber < 1) { throw new ArgumentOutOfRangeException("fieldNumber"); } if ((!Type.IsClass && !Type.IsInterface) || Type.IsSealed) { throw new InvalidOperationException("Sub-types can only be added to non-sealed classes: " + TypeHelper.NormalizeName(Type)); } if (!IsValidSubType(derivedType)) { throw new ArgumentException(TypeHelper.NormalizeName(derivedType) + " is not a valid sub-type of " + TypeHelper.NormalizeName(Type), "derivedType"); } int opaqueToken = 0; try { model.TakeLock(ref opaqueToken); MetaType metaType = model[derivedType]; ThrowIfFrozen(); metaType.ThrowIfFrozen(); if (IsAutoTuple || metaType.IsAutoTuple) { ThrowTupleTypeWithInheritance(derivedType); } if ((object)surrogateType != null) { ThrowSubTypeWithSurrogate(Type); } if ((object)metaType.surrogateType != null) { ThrowSubTypeWithSurrogate(derivedType); } SubType item = new SubType(fieldNumber, metaType, dataFormat); ThrowIfFrozen(); metaType.SetBaseType(this); (_subTypes ?? (_subTypes = new List<SubType>())).Add(item); return this; } finally { model.ReleaseLock(opaqueToken); } } private static void ThrowTupleTypeWithInheritance(Type type) { ThrowHelper.ThrowInvalidOperationException("Tuple-based types cannot be used in inheritance hierarchies: " + TypeHelper.NormalizeName(type), (Exception)null); } private void SetBaseType(MetaType baseType) { if (baseType == null) { throw new ArgumentNullException("baseType"); } if (this.baseType == baseType) { return; } if (this.baseType != null) { throw new InvalidOperationException("Type '" + this.baseType.Type.FullName + "' can only participate in one inheritance hierarchy"); } for (MetaType metaType = baseType; metaType != null; metaType = metaType.baseType) { if (metaType == this) { throw new InvalidOperationException("Cyclic inheritance of '" + this.baseType.Type.FullName + "' is not allowed"); } } this.baseType = baseType; } public MetaType SetCallbacks(MethodInfo beforeSerialize, MethodInfo afterSerialize, MethodInfo beforeDeserialize, MethodInfo afterDeserialize) { CheckSetCallbacks(); CallbackSet callbackSet = Callbacks; callbackSet.BeforeSerialize = beforeSerialize; callbackSet.AfterSerialize = afterSerialize; callbackSet.BeforeDeserialize = beforeDeserialize; callbackSet.AfterDeserialize = afterDeserialize; return this; } private void CheckSetCallbacks() { ThrowIfFrozen(); ThrowIfAutoTuple(); } public MetaType SetCallbacks(string beforeSerialize, string afterSerialize, string beforeDeserialize, string afterDeserialize) { CheckSetCallbacks(); CallbackSet callbackSet = Callbacks; callbackSet.BeforeSerialize = ResolveMethod(beforeSerialize, instance: true); callbackSet.AfterSerialize = ResolveMethod(afterSerialize, instance: true); callbackSet.BeforeDeserialize = ResolveMethod(beforeDeserialize, instance: true); callbackSet.AfterDeserialize = ResolveMethod(afterDeserialize, instance: true); return this; } public string GetSchemaTypeName() { return GetSchemaTypeName(null); } internal string GetSchemaTypeName(HashSet<Type> callstack) { if (callstack == null) { callstack = new HashSet<Type>(); } if (!callstack.Add(Type)) { return Type.Name; } try { if ((object)surrogateType != null && !callstack.Contains(surrogateType)) { return model[surrogateType].GetSchemaTypeName(callstack); } if (!string.IsNullOrEmpty(name)) { return name; } string text = Type.Name; if (Type.IsArray) { return GetArrayName(Type.GetElementType()); } if (Type.IsGenericType) { StringBuilder stringBuilder = new StringBuilder(text); int num = text.IndexOf('`'); if (num >= 0) { stringBuilder.Length = num; } Type[] genericArguments = Type.GetGenericArguments(); foreach (Type type in genericArguments) { stringBuilder.Append('_'); Type type2 = type; MetaType metaType; if (((TypeModel)model).IsDefined(type2) && (metaType = model[type2]) != null) { stringBuilder.Append(LastPart(metaType.GetSchemaTypeName(callstack))); continue; } if (type2.IsArray) { stringBuilder.Append(GetArrayName(type2.GetElementType())); continue; } metaType = null; try { metaType = model.Add(type2, applyDefaultBehaviour: true, (CompatibilityLevel)0); } catch { } if (metaType != null) { stringBuilder.Append(metaType.GetSchemaTypeName(callstack)); } else { stringBuilder.Append(type2.Name); } } return stringBuilder.ToString(); } return text; } finally { callstack.Remove(Type); } string GetArrayName(Type elementType) { MetaType metaType2; string text2 = ((((TypeModel)model).IsDefined(elementType) && (metaType2 = model[elementType]) != null) ? metaType2.GetSchemaTypeName(callstack) : elementType.Name); return "Array_" + text2; } static string LastPart(string value) { if (string.IsNullOrWhiteSpace(value)) { return value; } int num2 = value.LastIndexOf('.'); if (num2 >= 0) { return value.Substring(num2 + 1); } return value; } } internal string GuessPackage() { string text = Name; if (string.IsNullOrWhiteSpace(text)) { return null; } if (text[0] != '.') { return null; } return text[..text.LastIndexOf('.')].Trim(new char[1] { '.' }).Trim(); } public MetaType SetFactory(MethodInfo factory) { RuntimeTypeModel.VerifyFactory(factory, Type); ThrowIfFrozen(); ThrowIfAutoTuple(); this.factory = factory; return this; } public MetaType SetFactory(string factory) { return SetFactory(ResolveMethod(factory, instance: false)); } private MethodInfo ResolveMethod(string name, bool instance) { if (string.IsNullOrEmpty(name)) { return null; } if (!instance) { return Helpers.GetStaticMethod(Type, name); } return Helpers.GetInstanceMethod(Type, name); } internal static Exception InbuiltType(Type type, Exception innerException = null) { string message = "Data of this type has inbuilt behaviour, and cannot be added to a model in this way: " + type.FullName; if (innerException != null) { return new ArgumentException(message, innerException); } return new ArgumentException(message); } internal MetaType(RuntimeTypeModel model, Type type, MethodInfo factory) { this.factory = factory; if (model == null) { throw new ArgumentNullException("model"); } if ((object)type == null) { throw new ArgumentNullException("type"); } IRuntimeProtoSerializerNode runtimeProtoSerializerNode = model.TryGetBasicTypeSerializer(type); if (runtimeProtoSerializerNode != null) { throw InbuiltType(type); } Type = type; if (type.IsArray) { SetFlag(TypeOptions.Frozen, value: true, throwIfFrozen: false); } this.model = model; } internal void ThrowIfFrozen() { if ((flags & TypeOptions.Frozen) != 0) { throw new InvalidOperationException("The type cannot be changed once a serializer has been generated for " + Type.FullName); } } internal Type GetInheritanceRoot() { if (Type.IsValueType) { return null; } MetaType rootType = GetRootType(this); if (rootType != this) { return rootType.Type; } if (_subTypes != null && _subTypes.Count != 0) { return rootType.Type; } return null; } private SerializerFeatures GetFeatures() { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) if (Type.IsEnum) { return (SerializerFeatures)48; } if (!Type.IsValueType) { MetaType rootType = GetRootType(this); if (rootType != this) { return rootType.GetFeatures(); } } SerializerFeatures val = (SerializerFeatures)64; return (SerializerFeatures)(val | (IsGroup ? 19 : 18)); } private bool HasRealInheritance() { if (baseType == null || baseType == this) { return (_subTypes?.Count ?? 0) > 0; } return true; } private IProtoTypeSerializer BuildSerializer() { //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_026b: Unknown result type (might be due to invalid IL or missing references) //IL_0279: Unknown result type (might be due to invalid IL or missing references) //IL_01ec: Unknown result type (might be due to invalid IL or missing references) //IL_019b: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Unknown result type (might be due to invalid IL or missing references) //IL_047f: Unknown result type (might be due to invalid IL or missing references) if ((object)SerializerType != null) { return ExternalSerializer.Create(Type, SerializerType); } Validate(); RepeatedSerializerStub repeatedSerializerStub = model.TryGetRepeatedProvider(Type, (CompatibilityLevel)0); if (repeatedSerializerStub != null) { if ((object)surrogateType != null) { throw new ArgumentException("Repeated data (a list, collection, etc) has inbuilt behaviour and cannot use a surrogate"); } if (_subTypes != null && _subTypes.Count != 0) { throw new ArgumentException("Repeated data (a list, collection, etc) has inbuilt behaviour and cannot be subclassed"); } ValueMember valueMember = new ValueMember(model, 1, Type, repeatedSerializerStub.ItemType, null, (DataFormat)0) { CompatibilityLevel = CompatibilityLevel }; return TypeSerializer.Create(Type, new int[1] { 1 }, new IRuntimeProtoSerializerNode[1] { valueMember.Serializer }, null, isRootType: true, useConstructor: true, !IgnoreUnknownSubTypes, null, constructType, factory, GetInheritanceRoot(), GetFeatures()); } bool flag = HasRealInheritance(); if ((object)surrogateType != null) { if (flag) { ThrowSubTypeWithSurrogate(Type); } WireType defaultWireType; IRuntimeProtoSerializerNode runtimeProtoSerializerNode = ValueMember.TryGetCoreSerializer(Model, surrogateDataFormat, CompatibilityLevel, surrogateType, out defaultWireType, asReference: false, dynamicType: false, overwriteList: false, allowComplexTypes: false); SerializerFeatures features; if (runtimeProtoSerializerNode != null) { try { features = ExternalSerializer.Create(surrogateType, typeof(PrimaryTypeProvider)).Features; } catch (Exception innerException) { throw InbuiltType(surrogateType, innerException); } } else { MetaType metaType = model[surrogateType]; MetaType metaType2; while ((metaType2 = metaType.baseType) != null) { if (metaType.HasRealInheritance()) { ThrowSubTypeWithSurrogate(metaType.Type); } metaType = metaType2; } IProtoTypeSerializer serializer = metaType.Serializer; features = serializer.Features; runtimeProtoSerializerNode = serializer; } return (IProtoTypeSerializer)Activator.CreateInstance(typeof(SurrogateSerializer<>).MakeGenericType(Type), surrogateType, underlyingToSurrogate, surrogateToUnderlying, runtimeProtoSerializerNode, features); } if (IsAutoTuple) { if (flag) { ThrowTupleTypeWithInheritance(Type); } MemberInfo[] mappedMembers; ConstructorInfo constructorInfo = ResolveTupleConstructor(Type, out mappedMembers); if ((object)constructorInfo == null) { throw new InvalidOperationException(); } return (IProtoTypeSerializer)Activator.CreateInstance(typeof(TupleSerializer<>).MakeGenericType(Type), model, constructorInfo, mappedMembers, GetFeatures(), CompatibilityLevel); } if (HasFields) { Fields.TrimExcess(); } if (HasEnums) { Enums.TrimExcess(); } int num = _fields?.Count ?? 0; int num2 = _subTypes?.Count ?? 0; int[] array = new int[num + num2]; IRuntimeProtoSerializerNode[] array2 = new IRuntimeProtoSerializerNode[num + num2]; int num3 = 0; if (num2 != 0) { foreach (SubType subType in _subTypes) { if (!subType.DerivedType.IgnoreListHandling && model.TryGetRepeatedProvider(subType.DerivedType.Type, (CompatibilityLevel)0) != null) { ThrowHelper.ThrowArgumentException("Repeated data (a list, collection, etc) has inbuilt behaviour and cannot be used as a subclass"); } array[num3] = subType.FieldNumber; array2[num3++] = subType.GetSerializer(Type); } } if (num != 0) { foreach (ValueMember field in _fields) { array[num3] = field.FieldNumber; array2[num3++] = field.Serializer; } } List<MethodInfo> list = null; for (MetaType metaType3 = BaseType; metaType3 != null; metaType3 = metaType3.BaseType) { MethodInfo methodInfo = (metaType3.HasCallbacks ? metaType3.Callbacks.BeforeDeserialize : null); if ((object)methodInfo != null) { (list ?? (list = new List<MethodInfo>())).Add(methodInfo); } } MethodInfo[] array3 = null; if (list != null) { array3 = new MethodInfo[list.Count]; list.CopyTo(array3, 0); Array.Reverse((Array)array3); } return TypeSerializer.Create(Type, array, array2, array3, baseType == null, UseConstructor, !IgnoreUnknownSubTypes, callbacks, constructType, factory, GetInheritanceRoot(), GetFeatures()); } private static Type GetBaseType(MetaType type) { return type.Type.BaseType; } internal static bool GetAsReferenceDefault(Type type) { if ((object)type == null) { throw new ArgumentNullException("type"); } if (type.IsEnum) { return false; } AttributeMap[] array = AttributeMap.Create(type, inherit: false); for (int i = 0; i < array.Length; i++) { if (array[i].AttributeType.FullName == "ProtoBuf.ProtoContractAttribute" && array[i].TryGet("AsReferenceDefault", out var value)) { return (bool)value; } } return false; } internal void ApplyDefaultBehaviour(CompatibilityLevel ambient) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) TypeAddedEventArgs args = null; RuntimeTypeModel.OnBeforeApplyDefaultBehaviour(this, ref args); if (args == null || args.ApplyDefaultBehaviour) { ApplyDefaultBehaviourImpl(ambient); } RuntimeTypeModel.OnAfterApplyDefaultBehaviour(this, ref args); } private void ApplyDefaultBehaviourImpl(CompatibilityLevel ambient) { //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Invalid comparison between Unknown and I4 //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Invalid comparison between Unknown and I4 //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_047d: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_06e5: Unknown result type (might be due to invalid IL or missing references) //IL_01d6: Unknown result type (might be due to invalid IL or missing references) //IL_02fb: Unknown result type (might be due to invalid IL or missing references) //IL_05fd: Unknown result type (might be due to invalid IL or missing references) //IL_05a6: Unknown result type (might be due to invalid IL or missing references) Type type = GetBaseType(this); if ((object)type != null && model.FindWithoutAdd(type) == null && GetContractFamily(model, type, null) != 0) { model.FindOrAddAuto(type, demand: true, addWithContractOnly: false, addEvenIfAutoDisabled: false, ambient); } AttributeMap[] array = AttributeMap.Create(Type, inherit: false); AttributeFamily attributeFamily = GetContractFamily(model, Type, array); if (attributeFamily == AttributeFamily.AutoTuple) { SetFlag(TypeOptions.AutoTuple, value: true, throwIfFrozen: true); } CompatibilityLevel val = CompatibilityLevel; if ((int)val <= 0) { if (IsAutoTuple) { val = ambient; } if ((int)val <= 0) { val = Model.DefaultCompatibilityLevel; } CompatibilityLevel = TypeCompatibilityHelper.GetTypeCompatibilityLevel(Type, val); } bool isEnum = Type.IsEnum; if (attributeFamily == AttributeFamily.None && !isEnum) { return; } List<string> list = null; List<AttributeMap> list2 = n
plugins/protobuf-net.Core.dll
Decompiled 16 hours ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Buffers; using System.Buffers.Binary; using System.Buffers.Text; using System.CodeDom.Compiler; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.Immutable; using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Threading; using Microsoft.CodeAnalysis; using ProtoBuf.Internal; using ProtoBuf.Meta; using ProtoBuf.Serializers; using ProtoBuf.WellKnownTypes; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyFileVersion("3.2.30.709")] [assembly: AssemblyInformationalVersion("3.2.30+02c5dfe7c9")] [assembly: InternalsVisibleTo("protobuf-net.Test, PublicKey=002400000480000094000000060200000024000052534131000400000100010009ed9caa457bfc205716c3d4e8b255a63ddf71c9e53b1b5f574ab6ffdba11e80ab4b50be9c46d43b75206280070ddba67bd4c830f93f0317504a76ba6a48243c36d2590695991164592767a7bbc4453b34694e31e20815a096e4483605139a32a76ec2fef196507487329c12047bf6a68bca8ee9354155f4d01daf6eec5ff6bc")] [assembly: InternalsVisibleTo("protobuf-net, PublicKey=002400000480000094000000060200000024000052534131000400000100010009ed9caa457bfc205716c3d4e8b255a63ddf71c9e53b1b5f574ab6ffdba11e80ab4b50be9c46d43b75206280070ddba67bd4c830f93f0317504a76ba6a48243c36d2590695991164592767a7bbc4453b34694e31e20815a096e4483605139a32a76ec2fef196507487329c12047bf6a68bca8ee9354155f4d01daf6eec5ff6bc")] [assembly: InternalsVisibleTo("Benchmark, PublicKey=002400000480000094000000060200000024000052534131000400000100010009ed9caa457bfc205716c3d4e8b255a63ddf71c9e53b1b5f574ab6ffdba11e80ab4b50be9c46d43b75206280070ddba67bd4c830f93f0317504a76ba6a48243c36d2590695991164592767a7bbc4453b34694e31e20815a096e4483605139a32a76ec2fef196507487329c12047bf6a68bca8ee9354155f4d01daf6eec5ff6bc")] [assembly: InternalsVisibleTo("protobuf-net.MessagePipes, PublicKey=002400000480000094000000060200000024000052534131000400000100010009ed9caa457bfc205716c3d4e8b255a63ddf71c9e53b1b5f574ab6ffdba11e80ab4b50be9c46d43b75206280070ddba67bd4c830f93f0317504a76ba6a48243c36d2590695991164592767a7bbc4453b34694e31e20815a096e4483605139a32a76ec2fef196507487329c12047bf6a68bca8ee9354155f4d01daf6eec5ff6bc")] [assembly: InternalsVisibleTo("protobuf-net.ServiceModel, PublicKey=002400000480000094000000060200000024000052534131000400000100010009ed9caa457bfc205716c3d4e8b255a63ddf71c9e53b1b5f574ab6ffdba11e80ab4b50be9c46d43b75206280070ddba67bd4c830f93f0317504a76ba6a48243c36d2590695991164592767a7bbc4453b34694e31e20815a096e4483605139a32a76ec2fef196507487329c12047bf6a68bca8ee9354155f4d01daf6eec5ff6bc")] [assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")] [assembly: AssemblyCompany("Marc Gravell")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyCopyright("See https://github.com/protobuf-net/protobuf-net")] [assembly: AssemblyDescription("Provides simple access to fast and efficient \"Protocol Buffers\" serialization from .NET applications")] [assembly: AssemblyProduct("protobuf-net (net462)")] [assembly: AssemblyTitle("protobuf-net.Core")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/protobuf-net/protobuf-net")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("3.0.0.0")] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class IsReadOnlyAttribute : Attribute { } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class IsUnmanagedAttribute : Attribute { } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class IsByRefLikeAttribute : Attribute { } } [GeneratedCode("Nerdbank.GitVersioning.Tasks", "3.5.119.9565")] [ExcludeFromCodeCoverage] internal static class ThisAssembly { internal const string AssemblyConfiguration = "Release"; internal const string AssemblyFileVersion = "3.2.30.709"; internal const string AssemblyInformationalVersion = "3.2.30+02c5dfe7c9"; internal const string AssemblyName = "protobuf-net.Core"; internal const string AssemblyTitle = "protobuf-net.Core"; internal const string AssemblyVersion = "3.0.0.0"; internal static readonly DateTime GitCommitDate = new DateTime(638314372430000000L, DateTimeKind.Utc); internal const string GitCommitId = "02c5dfe7c99ac8550830662ce2b9bc6e1301a493"; internal const bool IsPrerelease = false; internal const bool IsPublicRelease = true; internal const string PublicKey = "002400000480000094000000060200000024000052534131000400000100010009ed9caa457bfc205716c3d4e8b255a63ddf71c9e53b1b5f574ab6ffdba11e80ab4b50be9c46d43b75206280070ddba67bd4c830f93f0317504a76ba6a48243c36d2590695991164592767a7bbc4453b34694e31e20815a096e4483605139a32a76ec2fef196507487329c12047bf6a68bca8ee9354155f4d01daf6eec5ff6bc"; internal const string PublicKeyToken = "257b51d87d2e4d67"; internal const string RootNamespace = "ProtoBuf"; } namespace System.Diagnostics.CodeAnalysis { [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, Inherited = false)] internal sealed class DynamicallyAccessedMembersAttribute : Attribute { public DynamicallyAccessedMemberTypes MemberTypes { get; } public DynamicallyAccessedMembersAttribute(DynamicallyAccessedMemberTypes memberTypes) { MemberTypes = memberTypes; } } [Flags] internal enum DynamicallyAccessedMemberTypes { None = 0, PublicParameterlessConstructor = 1, PublicConstructors = 3, NonPublicConstructors = 4, PublicMethods = 8, NonPublicMethods = 0x10, PublicFields = 0x20, NonPublicFields = 0x40, PublicNestedTypes = 0x80, NonPublicNestedTypes = 0x100, PublicProperties = 0x200, NonPublicProperties = 0x400, PublicEvents = 0x800, NonPublicEvents = 0x1000, All = -1 } } namespace ProtoBuf { internal enum TimeSpanScale { Days = 0, Hours = 1, Minutes = 2, Seconds = 3, Milliseconds = 4, Ticks = 5, MinMax = 15 } public static class BclHelpers { internal static readonly DateTime[] EpochOrigin = new DateTime[3] { new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc), new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Local) }; private const int MAX_DECIMAL_BYTES = 32; [MethodImpl(MethodImplOptions.AggressiveInlining)] public static object GetUninitializedObject(Type type) { return FormatterServices.GetUninitializedObject(type); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void WriteTimeSpan(TimeSpan timeSpan, ProtoWriter dest) { ProtoWriter.State state = dest.DefaultState(); WriteTimeSpanImpl(ref state, timeSpan, DateTimeKind.Unspecified); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void WriteTimeSpan(ref ProtoWriter.State state, TimeSpan value) { WriteTimeSpanImpl(ref state, value, DateTimeKind.Unspecified); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static void WriteTimeSpanImpl(ref ProtoWriter.State state, TimeSpan timeSpan, DateTimeKind kind) { switch (state.WireType) { case WireType.String: case WireType.StartGroup: { PrimaryTypeProvider.ScaledTicks value = new PrimaryTypeProvider.ScaledTicks(timeSpan, kind); state.WriteMessage(SerializerFeatures.OptionSkipRecursionCheck, value, SerializerCache<PrimaryTypeProvider>.InstanceField); break; } case WireType.Fixed64: state.WriteInt64(timeSpan.Ticks); break; default: ThrowHelper.ThrowProtoException("Unexpected wire-type: " + state.WireType); break; } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static TimeSpan ReadTimeSpan(ProtoReader source) { ProtoReader.State state = source.DefaultState(); return ReadTimeSpan(ref state); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static TimeSpan ReadTimeSpan(ref ProtoReader.State state) { switch (state.WireType) { case WireType.String: case WireType.StartGroup: return state.ReadMessage(SerializerFeatures.CategoryRepeated, default(PrimaryTypeProvider.ScaledTicks), SerializerCache<PrimaryTypeProvider>.InstanceField).ToTimeSpan(); case WireType.Fixed64: { long num = state.ReadInt64(); return num switch { long.MinValue => TimeSpan.MinValue, long.MaxValue => TimeSpan.MaxValue, _ => TimeSpan.FromTicks(num), }; } default: ThrowHelper.ThrowProtoException($"Unexpected wire-type: {state.WireType}"); return default(TimeSpan); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static TimeSpan ReadDuration(ProtoReader source) { ProtoReader.State state = source.DefaultState(); return ReadDuration(ref state); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static TimeSpan ReadDuration(ref ProtoReader.State state) { return state.ReadMessage(SerializerFeatures.CategoryRepeated, default(Duration), SerializerCache<PrimaryTypeProvider>.InstanceField); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void WriteDuration(TimeSpan value, ProtoWriter dest) { ProtoWriter.State state = dest.DefaultState(); WriteDuration(ref state, value); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void WriteDuration(ref ProtoWriter.State state, TimeSpan value) { state.WriteMessage(SerializerFeatures.OptionSkipRecursionCheck, (Duration)value, (ISerializer<Duration>)SerializerCache<PrimaryTypeProvider>.InstanceField); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static DateTime ReadTimestamp(ProtoReader source) { ProtoReader.State state = source.DefaultState(); return ReadTimestamp(ref state); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static DateTime ReadTimestamp(ref ProtoReader.State state) { return state.ReadMessage(SerializerFeatures.CategoryRepeated, default(Timestamp), SerializerCache<PrimaryTypeProvider>.InstanceField); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void WriteTimestamp(DateTime value, ProtoWriter dest) { ProtoWriter.State state = dest.DefaultState(); WriteTimestamp(ref state, value); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void WriteTimestamp(ref ProtoWriter.State state, DateTime value) { state.WriteMessage(SerializerFeatures.OptionSkipRecursionCheck, (Timestamp)value, (ISerializer<Timestamp>)SerializerCache<PrimaryTypeProvider>.InstanceField); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static DateTime ReadDateTime(ProtoReader source) { ProtoReader.State state = source.DefaultState(); return ReadDateTime(ref state); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static DateTime ReadDateTime(ref ProtoReader.State state) { switch (state.WireType) { case WireType.String: case WireType.StartGroup: return state.ReadMessage(SerializerFeatures.CategoryRepeated, default(PrimaryTypeProvider.ScaledTicks), SerializerCache<PrimaryTypeProvider>.InstanceField).ToDateTime(); case WireType.Fixed64: { long num = state.ReadInt64(); return num switch { long.MinValue => DateTime.MinValue, long.MaxValue => DateTime.MaxValue, _ => EpochOrigin[0].AddTicks(num), }; } default: ThrowHelper.ThrowProtoException($"Unexpected wire-type: {state.WireType}"); return default(DateTime); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void WriteDateTime(DateTime value, ProtoWriter dest) { ProtoWriter.State state = dest.DefaultState(); WriteDateTimeImpl(ref state, value, includeKind: false); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void WriteDateTime(ref ProtoWriter.State state, DateTime value) { WriteDateTimeImpl(ref state, value, includeKind: false); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void WriteDateTimeWithKind(DateTime value, ProtoWriter dest) { ProtoWriter.State state = dest.DefaultState(); WriteDateTimeImpl(ref state, value, includeKind: true); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void WriteDateTimeWithKind(ref ProtoWriter.State state, DateTime value) { WriteDateTimeImpl(ref state, value, includeKind: true); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static void WriteDateTimeImpl(ref ProtoWriter.State state, DateTime value, bool includeKind) { WireType wireType = state.WireType; TimeSpan timeSpan; if ((uint)(wireType - 2) <= 1u) { if (value == DateTime.MaxValue) { timeSpan = TimeSpan.MaxValue; includeKind = false; } else if (value == DateTime.MinValue) { timeSpan = TimeSpan.MinValue; includeKind = false; } else { timeSpan = value - EpochOrigin[0]; } } else { timeSpan = value - EpochOrigin[0]; } WriteTimeSpanImpl(ref state, timeSpan, includeKind ? value.Kind : DateTimeKind.Unspecified); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static decimal ReadDecimal(ProtoReader reader) { ProtoReader.State state = reader.DefaultState(); return ReadDecimal(ref state); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static decimal ReadDecimal(ref ProtoReader.State state) { return state.ReadMessage(SerializerFeatures.CategoryRepeated, 0m, SerializerCache<PrimaryTypeProvider>.InstanceField); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public unsafe static decimal ReadDecimalString(ref ProtoReader.State state) { byte* ptr = stackalloc byte[32]; Span<byte> span = state.ReadBytes(new Span<byte>(ptr, 32)); if (!Utf8Parser.TryParse((ReadOnlySpan<byte>)span, out decimal value, out int bytesConsumed, '\0') || bytesConsumed != span.Length) { ThrowHelper.ThrowInvalidOperationException("Unable to parse decimal: '" + Encoding.UTF8.GetString(ptr, span.Length) + "'"); } return value; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void WriteDecimal(decimal value, ProtoWriter writer) { ProtoWriter.State state = writer.DefaultState(); WriteDecimal(ref state, value); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void WriteDecimal(ref ProtoWriter.State state, decimal value) { state.WriteMessage(SerializerFeatures.OptionSkipRecursionCheck, value, SerializerCache<PrimaryTypeProvider>.InstanceField); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void WriteDecimalString(ref ProtoWriter.State state, decimal value) { byte[] array = ArrayPool<byte>.Shared.Rent(32); try { if (!Utf8Formatter.TryFormat(value, array, out var bytesWritten)) { ThrowHelper.ThrowInvalidOperationException($"Unable to format decimal: '{value}'"); } state.WriteBytes(new ReadOnlyMemory<byte>(array, 0, bytesWritten)); } finally { ArrayPool<byte>.Shared.Return(array); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void WriteGuid(Guid value, ProtoWriter dest) { ProtoWriter.State state = dest.DefaultState(); WriteGuid(ref state, value); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void WriteGuid(ref ProtoWriter.State state, Guid value) { state.WriteMessage(SerializerFeatures.OptionSkipRecursionCheck, value, SerializerCache<PrimaryTypeProvider>.InstanceField); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void WriteGuidBytes(ref ProtoWriter.State state, Guid value) { GuidHelper.Write(ref state, in value, asBytes: true); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void WriteGuidString(ref ProtoWriter.State state, Guid value) { GuidHelper.Write(ref state, in value, asBytes: false); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Guid ReadGuid(ProtoReader source) { ProtoReader.State state = source.DefaultState(); return ReadGuid(ref state); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Guid ReadGuid(ref ProtoReader.State state) { return state.ReadMessage(SerializerFeatures.CategoryRepeated, default(Guid), SerializerCache<PrimaryTypeProvider>.InstanceField); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Guid ReadGuidBytes(ref ProtoReader.State state) { return GuidHelper.Read(ref state); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Guid ReadGuidString(ref ProtoReader.State state) { return GuidHelper.Read(ref state); } } public sealed class BufferExtension : IExtension, IExtensionResettable { private ArraySegment<byte> _buffer; internal Type Type { get; private set; } internal BufferExtension Tail { get; private set; } internal void SetTail(Type type, BufferExtension tail) { Type = type; Tail = tail; } void IExtensionResettable.Reset() { _buffer = default(ArraySegment<byte>); } int IExtension.GetLength() { return _buffer.Count; } Stream IExtension.BeginAppend() { return new MemoryStream(); } void IExtension.EndAppend(Stream stream, bool commit) { using (stream) { if (!commit || !(stream is MemoryStream memoryStream) || !memoryStream.TryGetBuffer(out var buffer) || buffer.Count == 0) { return; } if (_buffer.Count == 0) { _buffer = buffer; return; } int num = _buffer.Offset + _buffer.Count; int num2 = _buffer.Array.Length - num; if (num2 >= buffer.Count) { Buffer.BlockCopy(buffer.Array, buffer.Offset, _buffer.Array, num, buffer.Count); _buffer = new ArraySegment<byte>(_buffer.Array, _buffer.Offset, num + buffer.Count); return; } byte[] array = new byte[_buffer.Count + buffer.Count]; Buffer.BlockCopy(_buffer.Array, _buffer.Offset, array, 0, _buffer.Count); Buffer.BlockCopy(buffer.Array, buffer.Offset, array, _buffer.Count, buffer.Count); _buffer = new ArraySegment<byte>(array, 0, _buffer.Count + buffer.Count); } } Stream IExtension.BeginQuery() { if (_buffer.Count != 0) { return new MemoryStream(_buffer.Array, _buffer.Offset, _buffer.Count, writable: false, publiclyVisible: true); } return Stream.Null; } void IExtension.EndQuery(Stream stream) { using (stream) { } } } internal static class BufferPool { private static readonly ArrayPool<byte> _pool = ArrayPool<byte>.Shared; internal const int BUFFER_LENGTH = 1024; private const int MaxByteArraySize = 2147483591; internal static byte[] GetBuffer() { return GetBuffer(1024); } internal static byte[] GetBuffer(int minSize) { byte[] cachedBuffer = GetCachedBuffer(minSize); return cachedBuffer ?? new byte[minSize]; } internal static byte[] GetCachedBuffer(int minSize) { return _pool.Rent(minSize); } internal static void ResizeAndFlushLeft(ref byte[] buffer, int toFitAtLeastBytes, int copyFromIndex, int copyBytes) { int num = buffer.Length * 2; if (num < 0) { num = 2147483591; } if (num < toFitAtLeastBytes) { num = toFitAtLeastBytes; } if (copyBytes == 0) { ReleaseBufferToPool(ref buffer); } byte[] array = GetCachedBuffer(num) ?? new byte[num]; if (copyBytes > 0) { Buffer.BlockCopy(buffer, copyFromIndex, array, 0, copyBytes); ReleaseBufferToPool(ref buffer); } buffer = array; } internal static void ReleaseBufferToPool(ref byte[] buffer) { byte[] array = buffer; buffer = null; if (array != null) { _pool.Return(array); } } } [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] [ImmutableObject(true)] public sealed class ProtoBeforeSerializationAttribute : Attribute { } [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] [ImmutableObject(true)] public sealed class ProtoAfterSerializationAttribute : Attribute { } [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] [ImmutableObject(true)] public sealed class ProtoBeforeDeserializationAttribute : Attribute { } [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] [ImmutableObject(true)] public sealed class ProtoAfterDeserializationAttribute : Attribute { } public enum CompatibilityLevel { NotSpecified = 0, Level200 = 200, Level240 = 240, Level300 = 300 } [ImmutableObject(true)] [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Module | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Interface, AllowMultiple = false, Inherited = true)] public sealed class CompatibilityLevelAttribute : Attribute { public CompatibilityLevel Level { get; } public CompatibilityLevelAttribute(CompatibilityLevel level) { Level = level; } internal static void AssertValid(CompatibilityLevel compatibilityLevel) { switch (compatibilityLevel) { case CompatibilityLevel.NotSpecified: case CompatibilityLevel.Level200: case CompatibilityLevel.Level240: case CompatibilityLevel.Level300: return; } Throw(compatibilityLevel); static void Throw(CompatibilityLevel compatibilityLevel) { throw new ArgumentOutOfRangeException("compatibilityLevel", $"Compatiblity level '{compatibilityLevel}' is not recognized."); } } } public enum DataFormat { Default, ZigZag, TwosComplement, FixedSize, Group, [Obsolete("This option is replaced with CompatibilityLevel, and is only used for Level200, where it changes this field to Level240", false)] WellKnown } [Serializable] [StructLayout(LayoutKind.Auto)] public readonly struct DiscriminatedUnionObject : ISerializable { public readonly object Object; public int Discriminator { get; } public bool Is(int discriminator) { return Discriminator == discriminator; } public DiscriminatedUnionObject(int discriminator, object value) { Discriminator = discriminator; Object = value; } public static void Reset(ref DiscriminatedUnionObject value, int discriminator) { if (value.Discriminator == discriminator) { value = default(DiscriminatedUnionObject); } } void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { if (Discriminator != 0) { info.AddValue("d", Discriminator); } if (Object != null) { info.AddValue("o", Object); } } private DiscriminatedUnionObject(SerializationInfo info, StreamingContext context) { this = default(DiscriminatedUnionObject); SerializationInfoEnumerator enumerator = info.GetEnumerator(); while (enumerator.MoveNext()) { SerializationEntry current = enumerator.Current; string name = current.Name; if (!(name == "d")) { if (name == "o") { Object = current.Value; } } else { Discriminator = (int)current.Value; } } } } [Serializable] [StructLayout(LayoutKind.Explicit)] public readonly struct DiscriminatedUnion64 : ISerializable { [FieldOffset(0)] private readonly int _discriminator; [FieldOffset(8)] public readonly long Int64; [FieldOffset(8)] public readonly ulong UInt64; [FieldOffset(8)] public readonly int Int32; [FieldOffset(8)] public readonly uint UInt32; [FieldOffset(8)] public readonly bool Boolean; [FieldOffset(8)] public readonly float Single; [FieldOffset(8)] public readonly double Double; [FieldOffset(8)] public readonly DateTime DateTime; [FieldOffset(8)] public readonly TimeSpan TimeSpan; public int Discriminator => _discriminator; private DiscriminatedUnion64(int discriminator) { this = default(DiscriminatedUnion64); _discriminator = discriminator; } public bool Is(int discriminator) { return _discriminator == discriminator; } public DiscriminatedUnion64(int discriminator, long value) : this(discriminator) { Int64 = value; } public DiscriminatedUnion64(int discriminator, int value) : this(discriminator) { Int32 = value; } public DiscriminatedUnion64(int discriminator, ulong value) : this(discriminator) { UInt64 = value; } public DiscriminatedUnion64(int discriminator, uint value) : this(discriminator) { UInt32 = value; } public DiscriminatedUnion64(int discriminator, float value) : this(discriminator) { Single = value; } public DiscriminatedUnion64(int discriminator, double value) : this(discriminator) { Double = value; } public DiscriminatedUnion64(int discriminator, bool value) : this(discriminator) { Boolean = value; } public DiscriminatedUnion64(int discriminator, DateTime? value) : this(value.HasValue ? discriminator : 0) { DateTime = value.GetValueOrDefault(); } public DiscriminatedUnion64(int discriminator, TimeSpan? value) : this(value.HasValue ? discriminator : 0) { TimeSpan = value.GetValueOrDefault(); } public static void Reset(ref DiscriminatedUnion64 value, int discriminator) { if (value.Discriminator == discriminator) { value = default(DiscriminatedUnion64); } } void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { if (_discriminator != 0) { info.AddValue("d", _discriminator); } if (Int64 != 0L) { info.AddValue("i", Int64); } } private DiscriminatedUnion64(SerializationInfo info, StreamingContext context) { this = default(DiscriminatedUnion64); SerializationInfoEnumerator enumerator = info.GetEnumerator(); while (enumerator.MoveNext()) { SerializationEntry current = enumerator.Current; string name = current.Name; if (!(name == "d")) { if (name == "i") { Int64 = (long)current.Value; } } else { _discriminator = (int)current.Value; } } } } [Serializable] [StructLayout(LayoutKind.Explicit)] public readonly struct DiscriminatedUnion128Object : ISerializable { [FieldOffset(0)] private readonly int _discriminator; [FieldOffset(8)] public readonly long Int64; [FieldOffset(8)] public readonly ulong UInt64; [FieldOffset(8)] public readonly int Int32; [FieldOffset(8)] public readonly uint UInt32; [FieldOffset(8)] public readonly bool Boolean; [FieldOffset(8)] public readonly float Single; [FieldOffset(8)] public readonly double Double; [FieldOffset(8)] public readonly DateTime DateTime; [FieldOffset(8)] public readonly TimeSpan TimeSpan; [FieldOffset(8)] public readonly Guid Guid; [FieldOffset(24)] public readonly object Object; [FieldOffset(8)] private readonly long _lo; [FieldOffset(16)] private readonly long _hi; public int Discriminator => _discriminator; private DiscriminatedUnion128Object(int discriminator) { this = default(DiscriminatedUnion128Object); _discriminator = discriminator; } public bool Is(int discriminator) { return _discriminator == discriminator; } public DiscriminatedUnion128Object(int discriminator, long value) : this(discriminator) { Int64 = value; } public DiscriminatedUnion128Object(int discriminator, int value) : this(discriminator) { Int32 = value; } public DiscriminatedUnion128Object(int discriminator, ulong value) : this(discriminator) { UInt64 = value; } public DiscriminatedUnion128Object(int discriminator, uint value) : this(discriminator) { UInt32 = value; } public DiscriminatedUnion128Object(int discriminator, float value) : this(discriminator) { Single = value; } public DiscriminatedUnion128Object(int discriminator, double value) : this(discriminator) { Double = value; } public DiscriminatedUnion128Object(int discriminator, bool value) : this(discriminator) { Boolean = value; } public DiscriminatedUnion128Object(int discriminator, object value) : this((value != null) ? discriminator : 0) { Object = value; } public DiscriminatedUnion128Object(int discriminator, DateTime? value) : this(value.HasValue ? discriminator : 0) { DateTime = value.GetValueOrDefault(); } public DiscriminatedUnion128Object(int discriminator, TimeSpan? value) : this(value.HasValue ? discriminator : 0) { TimeSpan = value.GetValueOrDefault(); } public DiscriminatedUnion128Object(int discriminator, Guid? value) : this(value.HasValue ? discriminator : 0) { Guid = value.GetValueOrDefault(); } public static void Reset(ref DiscriminatedUnion128Object value, int discriminator) { if (value.Discriminator == discriminator) { value = default(DiscriminatedUnion128Object); } } void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { if (_discriminator != 0) { info.AddValue("d", _discriminator); } if (_lo != 0L) { info.AddValue("l", _lo); } if (_hi != 0L) { info.AddValue("h", _hi); } if (Object != null) { info.AddValue("o", Object); } } private DiscriminatedUnion128Object(SerializationInfo info, StreamingContext context) { this = default(DiscriminatedUnion128Object); SerializationInfoEnumerator enumerator = info.GetEnumerator(); while (enumerator.MoveNext()) { SerializationEntry current = enumerator.Current; switch (current.Name) { case "d": _discriminator = (int)current.Value; break; case "l": _lo = (long)current.Value; break; case "h": _hi = (long)current.Value; break; case "o": Object = current.Value; break; } } } } [Serializable] [StructLayout(LayoutKind.Explicit)] public readonly struct DiscriminatedUnion128 : ISerializable { [FieldOffset(0)] private readonly int _discriminator; [FieldOffset(8)] public readonly long Int64; [FieldOffset(8)] public readonly ulong UInt64; [FieldOffset(8)] public readonly int Int32; [FieldOffset(8)] public readonly uint UInt32; [FieldOffset(8)] public readonly bool Boolean; [FieldOffset(8)] public readonly float Single; [FieldOffset(8)] public readonly double Double; [FieldOffset(8)] public readonly DateTime DateTime; [FieldOffset(8)] public readonly TimeSpan TimeSpan; [FieldOffset(8)] public readonly Guid Guid; [FieldOffset(8)] private readonly long _lo; [FieldOffset(16)] private readonly long _hi; public int Discriminator => _discriminator; private DiscriminatedUnion128(int discriminator) { this = default(DiscriminatedUnion128); _discriminator = discriminator; } public bool Is(int discriminator) { return _discriminator == discriminator; } public DiscriminatedUnion128(int discriminator, long value) : this(discriminator) { Int64 = value; } public DiscriminatedUnion128(int discriminator, int value) : this(discriminator) { Int32 = value; } public DiscriminatedUnion128(int discriminator, ulong value) : this(discriminator) { UInt64 = value; } public DiscriminatedUnion128(int discriminator, uint value) : this(discriminator) { UInt32 = value; } public DiscriminatedUnion128(int discriminator, float value) : this(discriminator) { Single = value; } public DiscriminatedUnion128(int discriminator, double value) : this(discriminator) { Double = value; } public DiscriminatedUnion128(int discriminator, bool value) : this(discriminator) { Boolean = value; } public DiscriminatedUnion128(int discriminator, DateTime? value) : this(value.HasValue ? discriminator : 0) { DateTime = value.GetValueOrDefault(); } public DiscriminatedUnion128(int discriminator, TimeSpan? value) : this(value.HasValue ? discriminator : 0) { TimeSpan = value.GetValueOrDefault(); } public DiscriminatedUnion128(int discriminator, Guid? value) : this(value.HasValue ? discriminator : 0) { Guid = value.GetValueOrDefault(); } public static void Reset(ref DiscriminatedUnion128 value, int discriminator) { if (value.Discriminator == discriminator) { value = default(DiscriminatedUnion128); } } void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { if (_discriminator != 0) { info.AddValue("d", _discriminator); } if (_lo != 0L) { info.AddValue("l", _lo); } if (_hi != 0L) { info.AddValue("h", _hi); } } private DiscriminatedUnion128(SerializationInfo info, StreamingContext context) { this = default(DiscriminatedUnion128); SerializationInfoEnumerator enumerator = info.GetEnumerator(); while (enumerator.MoveNext()) { SerializationEntry current = enumerator.Current; switch (current.Name) { case "d": _discriminator = (int)current.Value; break; case "l": _lo = (long)current.Value; break; case "h": _hi = (long)current.Value; break; } } } } [Serializable] [StructLayout(LayoutKind.Explicit)] public readonly struct DiscriminatedUnion64Object : ISerializable { [FieldOffset(0)] private readonly int _discriminator; [FieldOffset(8)] public readonly long Int64; [FieldOffset(8)] public readonly ulong UInt64; [FieldOffset(8)] public readonly int Int32; [FieldOffset(8)] public readonly uint UInt32; [FieldOffset(8)] public readonly bool Boolean; [FieldOffset(8)] public readonly float Single; [FieldOffset(8)] public readonly double Double; [FieldOffset(8)] public readonly DateTime DateTime; [FieldOffset(8)] public readonly TimeSpan TimeSpan; [FieldOffset(16)] public readonly object Object; public int Discriminator => _discriminator; private DiscriminatedUnion64Object(int discriminator) { this = default(DiscriminatedUnion64Object); _discriminator = discriminator; } public bool Is(int discriminator) { return _discriminator == discriminator; } public DiscriminatedUnion64Object(int discriminator, long value) : this(discriminator) { Int64 = value; } public DiscriminatedUnion64Object(int discriminator, int value) : this(discriminator) { Int32 = value; } public DiscriminatedUnion64Object(int discriminator, ulong value) : this(discriminator) { UInt64 = value; } public DiscriminatedUnion64Object(int discriminator, uint value) : this(discriminator) { UInt32 = value; } public DiscriminatedUnion64Object(int discriminator, float value) : this(discriminator) { Single = value; } public DiscriminatedUnion64Object(int discriminator, double value) : this(discriminator) { Double = value; } public DiscriminatedUnion64Object(int discriminator, bool value) : this(discriminator) { Boolean = value; } public DiscriminatedUnion64Object(int discriminator, object value) : this((value != null) ? discriminator : 0) { Object = value; } public DiscriminatedUnion64Object(int discriminator, DateTime? value) : this(value.HasValue ? discriminator : 0) { DateTime = value.GetValueOrDefault(); } public DiscriminatedUnion64Object(int discriminator, TimeSpan? value) : this(value.HasValue ? discriminator : 0) { TimeSpan = value.GetValueOrDefault(); } public static void Reset(ref DiscriminatedUnion64Object value, int discriminator) { if (value.Discriminator == discriminator) { value = default(DiscriminatedUnion64Object); } } void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { if (_discriminator != 0) { info.AddValue("d", _discriminator); } if (Int64 != 0L) { info.AddValue("i", Int64); } if (Object != null) { info.AddValue("o", Object); } } private DiscriminatedUnion64Object(SerializationInfo info, StreamingContext context) { this = default(DiscriminatedUnion64Object); SerializationInfoEnumerator enumerator = info.GetEnumerator(); while (enumerator.MoveNext()) { SerializationEntry current = enumerator.Current; switch (current.Name) { case "d": _discriminator = (int)current.Value; break; case "i": Int64 = (long)current.Value; break; case "o": Object = current.Value; break; } } } } [Serializable] [StructLayout(LayoutKind.Explicit)] public readonly struct DiscriminatedUnion32 : ISerializable { [FieldOffset(0)] private readonly int _discriminator; [FieldOffset(4)] public readonly int Int32; [FieldOffset(4)] public readonly uint UInt32; [FieldOffset(4)] public readonly bool Boolean; [FieldOffset(4)] public readonly float Single; public int Discriminator => _discriminator; private DiscriminatedUnion32(int discriminator) { this = default(DiscriminatedUnion32); _discriminator = discriminator; } public bool Is(int discriminator) { return _discriminator == discriminator; } public DiscriminatedUnion32(int discriminator, int value) : this(discriminator) { Int32 = value; } public DiscriminatedUnion32(int discriminator, uint value) : this(discriminator) { UInt32 = value; } public DiscriminatedUnion32(int discriminator, float value) : this(discriminator) { Single = value; } public DiscriminatedUnion32(int discriminator, bool value) : this(discriminator) { Boolean = value; } public static void Reset(ref DiscriminatedUnion32 value, int discriminator) { if (value.Discriminator == discriminator) { value = default(DiscriminatedUnion32); } } void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { if (_discriminator != 0) { info.AddValue("d", _discriminator); } if (Int32 != 0) { info.AddValue("i", Int32); } } private DiscriminatedUnion32(SerializationInfo info, StreamingContext context) { this = default(DiscriminatedUnion32); SerializationInfoEnumerator enumerator = info.GetEnumerator(); while (enumerator.MoveNext()) { SerializationEntry current = enumerator.Current; string name = current.Name; if (!(name == "d")) { if (name == "i") { Int32 = (int)current.Value; } } else { _discriminator = (int)current.Value; } } } } [Serializable] [StructLayout(LayoutKind.Explicit)] public readonly struct DiscriminatedUnion32Object : ISerializable { [FieldOffset(0)] private readonly int _discriminator; [FieldOffset(4)] public readonly int Int32; [FieldOffset(4)] public readonly uint UInt32; [FieldOffset(4)] public readonly bool Boolean; [FieldOffset(4)] public readonly float Single; [FieldOffset(8)] public readonly object Object; public int Discriminator => _discriminator; private DiscriminatedUnion32Object(int discriminator) { this = default(DiscriminatedUnion32Object); _discriminator = discriminator; } public bool Is(int discriminator) { return _discriminator == discriminator; } public DiscriminatedUnion32Object(int discriminator, int value) : this(discriminator) { Int32 = value; } public DiscriminatedUnion32Object(int discriminator, uint value) : this(discriminator) { UInt32 = value; } public DiscriminatedUnion32Object(int discriminator, float value) : this(discriminator) { Single = value; } public DiscriminatedUnion32Object(int discriminator, bool value) : this(discriminator) { Boolean = value; } public DiscriminatedUnion32Object(int discriminator, object value) : this((value != null) ? discriminator : 0) { Object = value; } public static void Reset(ref DiscriminatedUnion32Object value, int discriminator) { if (value.Discriminator == discriminator) { value = default(DiscriminatedUnion32Object); } } void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { if (_discriminator != 0) { info.AddValue("d", _discriminator); } if (Int32 != 0) { info.AddValue("i", Int32); } if (Object != null) { info.AddValue("o", Object); } } private DiscriminatedUnion32Object(SerializationInfo info, StreamingContext context) { this = default(DiscriminatedUnion32Object); SerializationInfoEnumerator enumerator = info.GetEnumerator(); while (enumerator.MoveNext()) { SerializationEntry current = enumerator.Current; switch (current.Name) { case "d": _discriminator = (int)current.Value; break; case "i": Int32 = (int)current.Value; break; case "o": Object = current.Value; break; } } } } public abstract class Extensible : ITypedExtensible, IExtensible { private IExtension extensionObject; IExtension IExtensible.GetExtensionObject(bool createIfMissing) { return GetExtensionObject(createIfMissing); } IExtension ITypedExtensible.GetExtensionObject(Type type, bool createIfMissing) { if ((object)type != GetType()) { return GetExtensionObject(ref extensionObject, type, createIfMissing); } return GetExtensionObject(createIfMissing); } [Obsolete("This API is considered, and may no longer be used in all scenarios (in particular when inheritance is involved); it is not recommended to rely on this API")] protected virtual IExtension GetExtensionObject(bool createIfMissing) { return GetExtensionObject(ref extensionObject, GetType(), createIfMissing); } public static IExtension GetExtensionObject(ref IExtension extensionObject, Type type, bool createIfMissing) { if ((object)type == null) { ThrowHelper.ThrowArgumentNullException("type"); } BufferExtension bufferExtension = extensionObject as BufferExtension; BufferExtension bufferExtension2 = bufferExtension; if (bufferExtension == null) { if (extensionObject != null) { ThrowHelper.ThrowNotSupportedException("Custom extension implementations should not be passed to GetExtensionObject"); } } else { while (bufferExtension2 != null) { Type type2 = bufferExtension2.Type; if ((object)type2 == null) { ThrowHelper.ThrowInvalidOperationException("Typed and untyped extension data cannot be mixed"); } if ((object)type2 == type) { return bufferExtension2; } bufferExtension2 = bufferExtension2.Tail; } } if (createIfMissing) { BufferExtension bufferExtension3 = new BufferExtension(); bufferExtension3.SetTail(type, bufferExtension); bufferExtension2 = (BufferExtension)(extensionObject = bufferExtension3); } return bufferExtension2; } public static IExtension GetExtensionObject(ref IExtension extensionObject, bool createIfMissing) { if (extensionObject == null) { if (createIfMissing) { extensionObject = new BufferExtension(); } } else if (extensionObject is BufferExtension bufferExtension && (object)bufferExtension.Type != null) { ThrowHelper.ThrowInvalidOperationException("Typed and untyped extension data cannot be mixed"); } return extensionObject; } public static void AppendValue<TValue>(IExtensible instance, int tag, TValue value) { ExtensibleUtil.AppendExtendValue(null, instance, tag, DataFormat.Default, value); } public static void AppendValue<TValue>(IExtensible instance, int tag, DataFormat format, TValue value) { ExtensibleUtil.AppendExtendValue(null, instance, tag, format, value); } public static void AppendValue<TValue>(TypeModel model, IExtensible instance, int tag, TValue value, DataFormat format = DataFormat.Default) { ExtensibleUtil.AppendExtendValue(model, instance, tag, format, value); } public static TValue GetValue<TValue>(IExtensible instance, int tag) { return GetValue<TValue>(null, instance, tag); } public static TValue GetValue<TValue>(IExtensible instance, int tag, DataFormat format) { return GetValue<TValue>(null, instance, tag, format); } public static TValue GetValue<TValue>(TypeModel model, IExtensible instance, int tag, DataFormat format = DataFormat.Default) { if (!TryGetValue<TValue>(model, instance, tag, out var value, format)) { return default(TValue); } return value; } public static bool TryGetValue<TValue>(IExtensible instance, int tag, out TValue value) { return TryGetValue<TValue>(null, instance, tag, out value); } public static bool TryGetValue<TValue>(IExtensible instance, int tag, DataFormat format, out TValue value) { return TryGetValue<TValue>(null, instance, tag, out value, format); } public static bool TryGetValue<TValue>(IExtensible instance, int tag, DataFormat format, bool allowDefinedTag, out TValue value) { return TryGetValue<TValue>(null, instance, tag, out value, format, allowDefinedTag); } public static bool TryGetValue<TValue>(TypeModel model, IExtensible instance, int tag, out TValue value, DataFormat format = DataFormat.Default, bool allowDefinedTag = false) { value = default(TValue); bool result = false; foreach (TValue extendedValue in ExtensibleUtil.GetExtendedValues<TValue>(model, instance, tag, format, singleton: true, allowDefinedTag)) { value = extendedValue; result = true; } return result; } public static IEnumerable<TValue> GetValues<TValue>(IExtensible instance, int tag) { return ExtensibleUtil.GetExtendedValues<TValue>(null, instance, tag, DataFormat.Default, singleton: false, allowDefinedTag: false); } public static IEnumerable<TValue> GetValues<TValue>(IExtensible instance, int tag, DataFormat format) { return ExtensibleUtil.GetExtendedValues<TValue>(null, instance, tag, format, singleton: false, allowDefinedTag: false); } public static IEnumerable<TValue> GetValues<TValue>(TypeModel model, IExtensible instance, int tag, DataFormat format = DataFormat.Default) { return ExtensibleUtil.GetExtendedValues<TValue>(model, instance, tag, format, singleton: false, allowDefinedTag: false); } public static bool TryGetValue(TypeModel model, Type type, IExtensible instance, int tag, DataFormat format, bool allowDefinedTag, out object value) { value = null; bool result = false; foreach (object extendedValue in ExtensibleUtil.GetExtendedValues(model, type, instance, tag, format, singleton: true, allowDefinedTag)) { value = extendedValue; result = true; } return result; } public static IEnumerable GetValues(TypeModel model, Type type, IExtensible instance, int tag, DataFormat format = DataFormat.Default) { return ExtensibleUtil.GetExtendedValues(model, type, instance, tag, format, singleton: false, allowDefinedTag: false); } public static void AppendValue(TypeModel model, IExtensible instance, int tag, DataFormat format, object value) { ExtensibleUtil.AppendExtendValue(model, instance, tag, format, value); } } internal static class ExtensibleUtil { internal static IEnumerable<TValue> GetExtendedValues<TValue>(TypeModel model, IExtensible instance, int tag, DataFormat format, bool singleton, bool allowDefinedTag) { foreach (TValue extendedValue in GetExtendedValues(model, typeof(TValue), instance, tag, format, singleton, allowDefinedTag)) { yield return extendedValue; } } internal static IEnumerable GetExtendedValues(TypeModel model, Type type, IExtensible instance, int tag, DataFormat format, bool singleton, bool allowDefinedTag) { if (instance == null) { ThrowHelper.ThrowArgumentNullException("instance"); } if (tag <= 0) { ThrowHelper.ThrowArgumentOutOfRangeException("tag"); } return GetExtendedValues(model, type, instance.GetExtensionObject(createIfMissing: false), tag, format, singleton); } internal static IEnumerable GetExtendedValues(TypeModel model, Type type, IExtension extn, int tag, DataFormat format, bool singleton) { if (model == null) { model = TypeModel.DefaultModel; } if (extn == null) { yield break; } Stream stream = extn.BeginQuery(); try { object value = null; SerializationContext userState = new SerializationContext(); ProtoReader.SolidState state = ProtoReader.State.Create(stream, model, userState, -1L).Solidify(); try { while (model.TryDeserializeAuxiliaryType(ref state, format, tag, type, ref value, skipOtherFields: true, asListItem: true, autoCreate: false, insideList: false, null, isRoot: false) && value != null) { if (!singleton) { yield return value; value = null; } } if (singleton && value != null) { yield return value; } } finally { state.Dispose(); } } finally { extn.EndQuery(stream); } } internal static void AppendExtendValue(TypeModel model, IExtensible instance, int tag, DataFormat format, object value) { if (instance == null) { ThrowHelper.ThrowArgumentNullException("instance"); } if (value == null) { ThrowHelper.ThrowArgumentNullException("value"); } AppendExtendValue(model, instance.GetExtensionObject(createIfMissing: true), tag, format, value); } internal static void AppendExtendValue(TypeModel model, IExtension extn, int tag, DataFormat format, object value) { if (model == null) { model = TypeModel.DefaultModel; } if (extn == null) { ThrowHelper.ThrowInvalidOperationException("No extension object available; appended data would be lost."); } bool commit = false; Stream stream = extn.BeginAppend(); try { ProtoWriter.State state = ProtoWriter.State.Create(stream, model); try { model.TrySerializeAuxiliaryType(ref state, null, format, tag, value, isInsideList: false, null, isRoot: false); state.Close(); } catch { state.Abandon(); throw; } finally { state.Dispose(); } commit = true; } finally { extn.EndAppend(stream, commit); } } } internal static class Helpers { internal static MethodInfo GetInstanceMethod(Type declaringType, string name) { return declaringType.GetMethod(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); } internal static MethodInfo GetStaticMethod(Type declaringType, string name) { return declaringType.GetMethod(name, BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); } internal static MethodInfo GetInstanceMethod(Type declaringType, string name, Type[] types) { if (types == null) { types = Type.EmptyTypes; } return declaringType.GetMethod(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, types, null); } internal static bool IsSubclassOf(Type type, Type baseClass) { return type.IsSubclassOf(baseClass); } public static ProtoTypeCode GetTypeCode(Type type) { TypeCode typeCode = Type.GetTypeCode(type); switch (typeCode) { case TypeCode.Empty: case TypeCode.Boolean: case TypeCode.Char: case TypeCode.SByte: case TypeCode.Byte: case TypeCode.Int16: case TypeCode.UInt16: case TypeCode.Int32: case TypeCode.UInt32: case TypeCode.Int64: case TypeCode.UInt64: case TypeCode.Single: case TypeCode.Double: case TypeCode.Decimal: case TypeCode.DateTime: case TypeCode.String: return (ProtoTypeCode)typeCode; default: if (type == typeof(TimeSpan)) { return ProtoTypeCode.TimeSpan; } if (type == typeof(Guid)) { return ProtoTypeCode.Guid; } if (type == typeof(Uri)) { return ProtoTypeCode.Uri; } if (type == typeof(byte[])) { return ProtoTypeCode.ByteArray; } if (type == typeof(ArraySegment<byte>)) { return ProtoTypeCode.ByteArraySegment; } if (type == typeof(Memory<byte>)) { return ProtoTypeCode.ByteMemory; } if (type == typeof(ReadOnlyMemory<byte>)) { return ProtoTypeCode.ByteReadOnlyMemory; } if (type == typeof(Type)) { return ProtoTypeCode.Type; } if (type == typeof(IntPtr)) { return ProtoTypeCode.IntPtr; } if (type == typeof(UIntPtr)) { return ProtoTypeCode.UIntPtr; } return ProtoTypeCode.Unknown; } } internal static MethodInfo GetGetMethod(PropertyInfo property, bool nonPublic, bool allowInternal) { if ((object)property == null) { return null; } MethodInfo methodInfo = property.GetGetMethod(nonPublic); if ((object)methodInfo == null && !nonPublic && allowInternal) { methodInfo = property.GetGetMethod(nonPublic: true); if ((object)methodInfo != null && !methodInfo.IsAssembly && !methodInfo.IsFamilyOrAssembly) { methodInfo = null; } } return methodInfo; } internal static MethodInfo GetSetMethod(PropertyInfo property, bool nonPublic, bool allowInternal) { if ((object)property == null) { return null; } MethodInfo methodInfo = property.GetSetMethod(nonPublic); if ((object)methodInfo == null && !nonPublic && allowInternal) { methodInfo = property.GetGetMethod(nonPublic: true); if ((object)methodInfo != null && !methodInfo.IsAssembly && !methodInfo.IsFamilyOrAssembly) { methodInfo = null; } } return methodInfo; } internal static ConstructorInfo GetConstructor(Type type, Type[] parameterTypes, bool nonPublic) { return type.GetConstructor(nonPublic ? (BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) : (BindingFlags.Instance | BindingFlags.Public), null, parameterTypes, null); } internal static ConstructorInfo[] GetConstructors(Type type, bool nonPublic) { return type.GetConstructors(nonPublic ? (BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) : (BindingFlags.Instance | BindingFlags.Public)); } internal static void GetBuffer(MemoryStream stream, out ArraySegment<byte> segment) { if (stream == null || !stream.TryGetBuffer(out segment)) { ThrowHelper.ThrowInvalidOperationException("Unable to obtain buffer from MemoryStream"); segment = default(ArraySegment<byte>); } } internal static PropertyInfo GetProperty(Type type, string name, bool nonPublic) { return type.GetProperty(name, nonPublic ? (BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) : (BindingFlags.Instance | BindingFlags.Public)); } internal static MemberInfo[] GetInstanceFieldsAndProperties(Type type, bool publicOnly) { BindingFlags bindingAttr = (publicOnly ? (BindingFlags.Instance | BindingFlags.Public) : (BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)); PropertyInfo[] properties = type.GetProperties(bindingAttr); FieldInfo[] fields = type.GetFields(bindingAttr); MemberInfo[] array = new MemberInfo[fields.Length + properties.Length]; properties.CopyTo(array, 0); fields.CopyTo(array, properties.Length); return array; } internal static Type GetMemberType(MemberInfo member) { return member.MemberType switch { MemberTypes.Field => ((FieldInfo)member).FieldType, MemberTypes.Property => ((PropertyInfo)member).PropertyType, _ => null, }; } } internal enum ProtoTypeCode { Empty = 0, Unknown = 1, Boolean = 3, Char = 4, SByte = 5, Byte = 6, Int16 = 7, UInt16 = 8, Int32 = 9, UInt32 = 10, Int64 = 11, UInt64 = 12, Single = 13, Double = 14, Decimal = 15, DateTime = 16, String = 18, TimeSpan = 100, ByteArray = 101, Guid = 102, Uri = 103, Type = 104, ByteArraySegment = 105, ByteMemory = 106, ByteReadOnlyMemory = 107, IntPtr = 108, UIntPtr = 109 } public interface IExtensible { IExtension GetExtensionObject(bool createIfMissing); } public interface ITypedExtensible { IExtension GetExtensionObject(Type type, bool createIfMissing); } public interface IExtension { Stream BeginAppend(); void EndAppend(Stream stream, bool commit); Stream BeginQuery(); void EndQuery(Stream stream); int GetLength(); } public interface IExtensionResettable : IExtension { void Reset(); } public enum ImplicitFields { None, AllPublic, AllFields } public interface IProtoInput<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] TInput> { T Deserialize<T>(TInput source, T value = default(T), object userState = null); } public interface IProtoOutput<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] TOutput> { void Serialize<T>(TOutput destination, T value, object userState = null); } public interface IMeasuredProtoOutput<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] TOutput> : IProtoOutput<TOutput> { MeasureState<T> Measure<T>(T value, object userState = null); void Serialize<T>(MeasureState<T> measured, TOutput destination); } public interface ISerializationContext { TypeModel Model { get; } object UserState { get; } } public struct MeasureState<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] T> : IDisposable { private readonly TypeModel _model; private readonly T _value; private readonly object _userState; private ProtoWriter _writer; public long Length { get; } internal MeasureState(TypeModel model, in T value, object userState, long abortAfter) { _model = model; _value = value; _userState = userState; ProtoWriter.State state = ProtoWriter.NullProtoWriter.CreateNullProtoWriter(_model, userState, abortAfter); try { Length = TypeModel.SerializeImpl(ref state, _value); ProtoWriter.NullProtoWriter.CheckOversized(abortAfter, Length); _writer = state.GetWriter(); } catch { state.Dispose(); throw; } } public void Dispose() { ProtoWriter writer = _writer; _writer = null; writer?.Dispose(); } public long LengthOnly() { long length = Length; Dispose(); return length; } private void SerializeCore(ProtoWriter.State state) { try { ProtoWriter writer = _writer; if (writer == null) { throw new ObjectDisposedException("MeasureState"); } ProtoWriter writer2 = state.GetWriter(); writer2.InitializeFrom(writer); long num = TypeModel.SerializeImpl(ref state, _value); writer2.CopyBack(writer); if (num != Length) { ThrowHelper.ThrowInvalidOperationException($"Invalid length; expected {Length}, actual: {num}"); } } catch (Exception ex) { ex.Data?.Add("ProtoBuf.MeasuredLength", Length); throw; } finally { state.Dispose(); } } internal int GetLengthHits(out int misses) { return _writer.GetLengthHits(out misses); } public void Serialize(Stream stream) { SerializeCore(ProtoWriter.State.Create(stream, _model, _userState)); } public void Serialize(IBufferWriter<byte> writer) { SerializeCore(ProtoWriter.State.Create(writer, _model, _userState)); } } internal sealed class NetObjectCache { [StructLayout(LayoutKind.Auto)] private readonly struct ObjectKey : IEquatable<ObjectKey> { private readonly object _obj; private readonly Type _subTypeLevel; [MethodImpl(MethodImplOptions.AggressiveInlining)] public ObjectKey(object obj, Type subTypeLevel) { _obj = obj; _subTypeLevel = subTypeLevel; } public override string ToString() { return $"{_subTypeLevel}/{_obj}"; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public override int GetHashCode() { return RuntimeHelpers.GetHashCode(_obj) ^ (_subTypeLevel?.GetHashCode() ?? 0); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public override bool Equals(object obj) { if (obj is ObjectKey other) { return Equals(other); } return false; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(ObjectKey other) { return (_obj == other._obj) & (_subTypeLevel == other._subTypeLevel); } } private readonly Dictionary<ObjectKey, long> _knownLengths = new Dictionary<ObjectKey, long>(); private int _hit; private int _miss; internal int LengthHits => _hit; internal int LengthMisses => _miss; [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool TryGetKnownLength(object obj, Type subTypeLevel, out long length) { if (_knownLengths.TryGetValue(new ObjectKey(obj, subTypeLevel), out length)) { _hit++; return true; } _miss++; length = 0L; return false; } public void SetKnownLength(object obj, Type subTypeLevel, long length) { ObjectKey key = new ObjectKey(obj, subTypeLevel); _knownLengths[key] = length; } internal void Clear() { _knownLengths.Clear(); _hit = (_miss = 0); } internal void InitializeFrom(NetObjectCache obj) { if (obj == null) { return; } _knownLengths.Clear(); foreach (KeyValuePair<ObjectKey, long> knownLength in obj._knownLengths) { _knownLengths.Add(knownLength.Key, knownLength.Value); } } internal void CopyBack(NetObjectCache obj) { if (obj != null) { obj._hit += _hit; obj._miss += _miss; } } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] public sealed class NullWrappedValueAttribute : Attribute { public bool AsGroup { get; set; } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] public sealed class NullWrappedCollectionAttribute : Attribute { public bool AsGroup { get; set; } } public enum PrefixStyle { None, Base128, Fixed32, Fixed32BigEndian } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Interface, AllowMultiple = false, Inherited = false)] public sealed class ProtoContractAttribute : Attribute { [Flags] private enum TypeOptions : ushort { InferTagFromName = 1, InferTagFromNameHasValue = 2, UseProtoMembersOnly = 4, SkipConstructor = 8, IgnoreListHandling = 0x10, IsGroup = 0x100, IgnoreUnknownSubTypes = 0x200 } internal const string ReferenceDynamicDisabled = "Reference-tracking and dynamic-type are not currently implemented in this build; they may be reinstated later; this is partly due to doubts over whether the features are adviseable, and partly over confidence in testing all the scenarios (it takes time; that time hasn't get happened); feedback is invited"; private int implicitFirstTag; private TypeOptions flags; public string Name { get; set; } public string Origin { get; set; } public int ImplicitFirstTag { get { return implicitFirstTag; } set { if (value < 1) { ThrowHelper.ThrowArgumentOutOfRangeException("ImplicitFirstTag"); } implicitFirstTag = value; } } public bool UseProtoMembersOnly { get { return HasFlag(TypeOptions.UseProtoMembersOnly); } set { SetFlag(TypeOptions.UseProtoMembersOnly, value); } } public bool IgnoreListHandling { get { return HasFlag(TypeOptions.IgnoreListHandling); } set { SetFlag(TypeOptions.IgnoreListHandling, value); } } public ImplicitFields ImplicitFields { get; set; } public bool InferTagFromName { get { return HasFlag(TypeOptions.InferTagFromName); } set { SetFlag(TypeOptions.InferTagFromName, value); SetFlag(TypeOptions.InferTagFromNameHasValue, value: true); } } internal bool InferTagFromNameHasValue => HasFlag(TypeOptions.InferTagFromNameHasValue); public int DataMemberOffset { get; set; } public bool SkipConstructor { get { return HasFlag(TypeOptions.SkipConstructor); } set { SetFlag(TypeOptions.SkipConstructor, value); } } public bool AsReferenceDefault { get { return false; } [Obsolete("Reference-tracking and dynamic-type are not currently implemented in this build; they may be reinstated later; this is partly due to doubts over whether the features are adviseable, and partly over confidence in testing all the scenarios (it takes time; that time hasn't get happened); feedback is invited", true)] set { if (value != AsReferenceDefault) { ThrowHelper.ThrowNotSupportedException(); } } } public bool IsGroup { get { return HasFlag(TypeOptions.IsGroup); } set { SetFlag(TypeOptions.IsGroup, value); } } public bool IgnoreUnknownSubTypes { get { return HasFlag(TypeOptions.IgnoreUnknownSubTypes); } set { SetFlag(TypeOptions.IgnoreUnknownSubTypes, value); } } [Obsolete("Enum value maps have been deprecated and are no longer supported; all enums are now effectively pass-thru; custom maps should be applied via shadow properties; in C#, lambda-based 'switch expressions' make for very convenient shadow properties", true)] public bool EnumPassthru { get { return true; } set { if (!value) { ThrowHelper.ThrowInvalidOperationException("EnumPassthru is not longer supported, and is always considered true"); } } } public Type Surrogate { get; set; } [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor | DynamicallyAccessedMemberTypes.PublicMethods)] public Type Serializer { get; set; } private bool HasFlag(TypeOptions flag) { return (flags & flag) == flag; } private void SetFlag(TypeOptions flag, bool value) { if (value) { flags |= flag; } else { flags &= (TypeOptions)(ushort)(~(int)flag); } } } [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] public class ProtoConverterAttribute : Attribute { } [AttributeUsage(AttributeTargets.Field, AllowMultiple = false)] public sealed class ProtoEnumAttribute : Attribute { internal const string EnumValueDeprecated = "Enum value maps have been deprecated and are no longer supported; all enums are now effectively pass-thru; custom maps should be applied via shadow properties; in C#, lambda-based 'switch expressions' make for very convenient shadow properties"; public int Value { [Obsolete("Enum value maps have been deprecated and are no longer supported; all enums are now effectively pass-thru; custom maps should be applied via shadow properties; in C#, lambda-based 'switch expressions' make for very convenient shadow properties", false)] get { return 0; } [Obsolete("Enum value maps have been deprecated and are no longer supported; all enums are now effectively pass-thru; custom maps should be applied via shadow properties; in C#, lambda-based 'switch expressions' make for very convenient shadow properties", true)] set { ThrowHelper.ThrowNotSupportedException(); } } public string Name { get; set; } [Obsolete("Enum value maps have been deprecated and are no longer supported; all enums are now effectively pass-thru; custom maps should be applied via shadow properties; in C#, lambda-based 'switch expressions' make for very convenient shadow properties", false)] public bool HasValue() { return false; } } [Serializable] public class ProtoException : Exception { public ProtoException() { } public ProtoException(string message) : base(message) { } public ProtoException(string message, Exception innerException) : base(message, innerException) { } protected ProtoException(SerializationInfo info, StreamingContext context) : base(info, context) { } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false, Inherited = true)] public class ProtoIgnoreAttribute : Attribute { } [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)] public sealed class ProtoPartialIgnoreAttribute : ProtoIgnoreAttribute { public string MemberName { get; } public ProtoPartialIgnoreAttribute(string memberName) { if (string.IsNullOrEmpty(memberName)) { ThrowHelper.ThrowArgumentNullException("memberName"); } MemberName = memberName; } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = true, Inherited = false)] public sealed class ProtoIncludeAttribute : Attribute { public int Tag { get; } [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] public string KnownTypeName { get; } [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] public Type KnownType => TypeModel.ResolveKnownType(KnownTypeName, null); [DefaultValue(DataFormat.Default)] public DataFormat DataFormat { get; set; } public ProtoIncludeAttribute(int tag, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] Type knownType) : this(tag, ((object)knownType == null) ? "" : knownType.AssemblyQualifiedName) { } public ProtoIncludeAttribute(int tag, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] string knownTypeName) { if (tag <= 0) { ThrowHelper.ThrowArgumentOutOfRangeException("tag", "Tags must be positive integers"); } if (string.IsNullOrEmpty(knownTypeName)) { ThrowHelper.ThrowArgumentNullException("knownTypeName", "Known type cannot be blank"); } Tag = tag; KnownTypeName = knownTypeName; } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] public class ProtoMapAttribute : Attribute { public DataFormat KeyFormat { get; set; } public DataFormat ValueFormat { get; set; } public bool DisableMap { get; set; } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false, Inherited = true)] public class ProtoMemberAttribute : Attribute, IComparable, IComparable<ProtoMemberAttribute> { internal MemberInfo Member; internal MemberInfo BackingMember; internal bool TagIsPinned; private string name; private DataFormat dataFormat; private int tag; private MemberSerializationOptions options; public string Name { get { return name; } set { name = value; } } public DataFormat DataFormat { get { return dataFormat; } set { dataFormat = value; } } public int Tag => tag; public bool IsRequired { get { return (options & MemberSerializationOptions.Required) == MemberSerializationOptions.Required; } set { if (value) { options |= MemberSerializationOptions.Required; } else { options &= ~MemberSerializationOptions.Required; } } } public bool IsPacked { get { return (options & MemberSerializationOptions.Packed) == MemberSerializationOptions.Packed; } set { if (value) { options |= MemberSerializationOptions.Packed; } else { options &= ~MemberSerializationOptions.Packed; } } } public bool OverwriteList { get { return (options & MemberSerializationOptions.OverwriteList) == MemberSerializationOptions.OverwriteList; } set { if (value) { options |= MemberSerializationOptions.OverwriteList; } else { options &= ~MemberSerializationOptions.OverwriteList; } } } [Obsolete("Reference-tracking and dynamic-type are not currently implemented in this build; they may be reinstated later; this is partly due to doubts over whether the features are adviseable, and partly over confidence in testing all the scenarios (it takes time; that time hasn't get happened); feedback is invited", true)] public bool AsReference { get { return (options & MemberSerializationOptions.AsReference) == MemberSerializationOptions.AsReference; } set { if (value) { options |= MemberSerializationOptions.AsReference; } else { options &= ~MemberSerializationOptions.AsReference; } options |= MemberSerializationOptions.AsReferenceHasValue; } } [Obsolete("Reference-tracking and dynamic-type are not currently implemented in this build; they may be reinstated later; this is partly due to doubts over whether the features are adviseable, and partly over confidence in testing all the scenarios (it takes time; that time hasn't get happened); feedback is invited", true)] internal bool AsReferenceHasValue { get { return (options & MemberSerializationOptions.AsReferenceHasValue) == MemberSerializationOptions.AsReferenceHasValue; } set { if (value) { options |= MemberSerializationOptions.AsReferenceHasValue; } else { options &= ~MemberSerializationOptions.AsReferenceHasValue; } } } [Obsolete("Reference-tracking and dynamic-type are not currently implemented in this build; they may be reinstated later; this is partly due to doubts over whether the features are adviseable, and partly over confidence in testing all the scenarios (it takes time; that time hasn't get happened); feedback is invited", true)] public bool DynamicType { get { return (options & MemberSerializationOptions.DynamicType) == MemberSerializationOptions.DynamicType; } set { if (value) { options |= MemberSerializationOptions.DynamicType; } else { options &= ~MemberSerializationOptions.DynamicType; } } } public MemberSerializationOptions Options { get { return options; } set { options = value; } } public int CompareTo(object other) { return CompareTo(other as ProtoMemberAttribute); } public int CompareTo(ProtoMemberAttribute other) { if (other == null) { return -1; } if (this == other) { return 0; } int num = tag.CompareTo(other.tag); if (num == 0) { num = string.CompareOrdinal(name, other.name); } return num; } public ProtoMemberAttribute(int tag) : this(tag, forced: false) { } internal ProtoMemberAttribute(int tag, bool forced) { if (tag <= 0 && !forced) { ThrowHelper.ThrowArgumentOutOfRangeException("tag"); } this.tag = tag; } internal void Rebase(int tag) { this.tag = tag; } } [Flags] public enum MemberSerializationOptions { None = 0, Packed = 1, Required = 2, [Obsolete("Reference-tracking and dynamic-type are not currently implemented in this build; they may be reinstated later; this is partly due to doubts over whether the features are adviseable, and partly over confidence in testing all the scenarios (it takes time; that time hasn't get happened); feedback is invited", false)] AsReference = 4, [Obsolete("Reference-tracking and dynamic-type are not currently implemented in this build; they may be reinstated later; this is partly due to doubts over whether the features are adviseable, and partly over confidence in testing all the scenarios (it takes time; that time hasn't get happened); feedback is invited", false)] DynamicType = 8, OverwriteList = 0x10, [Obsolete("Reference-tracking and dynamic-type are not currently implemented in this build; they may be reinstated later; this is partly due to doubts over whether the features are adviseable, and partly over confidence in testing all the scenarios (it takes time; that time hasn't get happened); feedback is invited", false)] AsReferenceHasValue = 0x20 } [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)] public sealed class ProtoPartialMemberAttribute : ProtoMemberAttribute { public string MemberName { get; private set; } public ProtoPartialMemberAttribute(int tag, string memberName) : base(tag) { if (string.IsNullOrEmpty(memberName)) { ThrowHelper.ThrowArgumentNullException("memberName"); } MemberName = memberName; } } public abstract class ProtoReader : IDisposable, ISerializationContext { private protected enum Read32VarintMode { Signed, Unsigned, FieldHeader } [StructLayout(LayoutKind.Auto)] public ref struct State { private ProtoReader _reader; private ReadOnlyMemory<byte> _memory; internal ReadOnlySpan<byte> Span { get; private set; } internal int OffsetInCurrent { get; private set; } internal int RemainingInCurrent { get; private set; } public WireType WireType { [MethodImpl(MethodImplOptions.AggressiveInlining)] get { return _reader.WireType; } } public bool InternStrings { get { return _reader.InternStrings; } set { _reader.InternStrings = value; } } public int FieldNumber { [MethodImpl(MethodImplOptions.AggressiveInlining)] get { return _reader._fieldNumber; } } internal TypeModel Model { [MethodImpl(MethodImplOptions.AggressiveInlining)] get { return _reader?.Model; } private set { _reader.Model = value; } } public ISerializationContext Context { [MethodImpl(MethodImplOptions.AggressiveInlining)] get { return _reader; } } public static State Create(ReadOnlySequence<byte> source, TypeModel model, object userState = null) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) ReadOnlySequenceProtoReader readOnlySequenceProtoReader = Pool<ReadOnlySequenceProtoReader>.TryGet() ?? new ReadOnlySequenceProtoReader(); readOnlySequenceProtoReader.Init(source, model, userState); return new State(readOnlySequenceProtoReader); } public static State Create(ReadOnlyMemory<byte> source, TypeModel model, object userState = null) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return Create(new ReadOnlySequence<byte>(source), model, userState); } public void Dispose() { ProtoReader reader = _reader; this = default(State); reader?.Dispose(); } internal SolidState Solidify() { return new SolidState(_reader, _memory.Slice(OffsetInCurrent, RemainingInCurrent)); } internal State(ProtoReader reader, ReadOnlyMemory<byte> memory) : this(reader) { Init(memory); } internal State(ProtoReader reader) { this = default(State); _reader = reader; } internal void Init(ReadOnlyMemory<byte> memory) { _memory = memory; Span = memory.Span; OffsetInCurrent = 0; RemainingInCurrent = Span.Length; } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal void Skip(int bytes) { OffsetInCurrent += bytes; RemainingInCurrent -= bytes; } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal ReadOnlySpan<byte> Consume(int bytes) { ReadOnlySpan<byte> result = Span.Slice(OffsetInCurrent, bytes); OffsetInCurrent += bytes; RemainingInCurrent -= bytes; return result; } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal ReadOnlySpan<byte> Consume(int bytes, out int offset) { offset = OffsetInCurrent; OffsetInCurrent += bytes; RemainingInCurrent -= bytes; return Span; } internal int ReadVarintUInt32(out uint value) { value = Span[OffsetInCurrent]; int num = (((value & 0x80) == 0) ? 1 : ParseVarintUInt32Tail(Span.Slice(OffsetInCurrent), ref value)); OffsetInCurrent += num; RemainingInCurrent -= num; return num; } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal int ParseVarintUInt32(ReadOnlySpan<byte> span, out uint value) { value = span[0]; if ((value & 0x80u) != 0) { return ParseVarintUInt32Tail(span, ref value); } return 1; } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal int ParseVarintUInt32(ReadOnlySpan<byte> span, int offset, out uint value) { value = span[offset]; if ((value & 0x80u) != 0) { return ParseVarintUInt32Tail(span.Slice(offset), ref value); } return 1; } private int ParseVarintUInt32Tail(ReadOnlySpan<byte> span, ref uint value) { uint num = span[1]; value = (value & 0x7Fu) | ((num & 0x7F) << 7); if ((num & 0x80) == 0) { return 2; } num = span[2]; value |= (num & 0x7F) << 14; if ((num & 0x80) == 0) { return 3; } num = span[3]; value |= (num & 0x7F) << 21; if ((num & 0x80) == 0) { return 4; } num = span[4]; value |= num << 28; if ((num & 0xF0) == 0) { return 5; } ThrowOverflow(); return 0; } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal void Advance(long count) { _reader.Advance(count); } internal static int TryParseUInt64Varint(ReadOnlySpan<byte> span, int offset, out ulong value) { if ((uint)offset >= (uint)span.Length) { value = 0uL; return 0; } value = span[offset++]; if ((value & 0x80) == 0L) { return 1; } value &= 127uL; if ((uint)offset >= (uint)span.Length) { NoContextThrowEoF(); } ulong num = span[offset++]; value |= (num & 0x7F) << 7; if ((num & 0x80) == 0L) { return 2; } if ((uint)offset >= (uint)span.Length) { NoContextThrowEoF(); } num = span[offset++]; value |= (num & 0x7F) << 14; if ((num & 0x80) == 0L) { return 3; } if ((uint)offset >= (uint)span.Length) { NoContextThrowEoF(); } num = span[offset++]; value |= (num & 0x7F) << 21; if ((num & 0x80) == 0L) { return 4; } if ((uint)offset >= (uint)span.Length) { NoContextThrowEoF(); } num = span[offset++]; value |= (num & 0x7F) << 28; if ((num & 0x80) == 0L) { return 5; } if ((uint)offset >= (uint)span.Length) { NoContextThrowEoF(); } num = span[offset++]; value |= (num & 0x7F) << 35; if ((num & 0x80) == 0L) { return 6; } if ((uint)offset >= (uint)span.Length) { NoContextThrowEoF(); } num = span[offset++]; value |= (num & 0x7F) << 42; if ((num & 0x80) == 0L) { return 7; } if ((uint)offset >= (uint)span.Length) { NoContextThrowEoF(); } num = span[offset++]; value |= (num & 0x7F) << 49; if ((num & 0x80) == 0L) { return 8; } if ((uint)offset >= (uint)span.Length) { NoContextThrowEoF(); } num = span[offset++]; value |= (num & 0x7F) << 56; if ((num & 0x80) == 0L) { return 9; } if ((uint)offset >= (uint)span.Length) { NoContextThrowEoF(); } num = span[offset]; value |= num << 63; if ((num & 0xFFFFFFFFFFFFFFFEuL) != 0L) { NoContextThrowOverflow(); } return 10; } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal ProtoReader GetReader() { return _reader; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public ushort ReadUInt16() { return checked((ushort)ReadUInt32()); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public short ReadInt16() { return checked((short)ReadInt32()); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public long GetPosition() { return _reader._longPosition; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public byte ReadByte() { return checked((byte)ReadUInt32()); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public sbyte ReadSByte() { return checked((sbyte)ReadInt32()); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public IntPtr ReadIntPtr() { return new IntPtr(ReadInt64()); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public UIntPtr ReadUIntPtr() { return new UIntPtr(ReadUInt64()); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public uint ReadUInt32() { switch (_reader.WireType) { case WireType.Variant: return ReadUInt32Varint(Read32VarintMode.Signed); case WireType.Fixed32: return _reader.ImplReadUInt32Fixed(ref this); case WireType.Fixed64: { ulong num = _reader.ImplReadUInt64Fixed(ref this); return checked((uint)num); } default: ThrowWireTypeException(); return 0u; } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public int ReadInt32() { switch (_reader.WireType) { case WireType.Variant: return (int)ReadUInt32Varint(Read32VarintMode.Signed); case WireType.Fixed32: return (int)_reader.ImplReadUInt32Fixed(ref this); case WireType.Fixed64: { long num = ReadInt64(); return checked((int)num); } case WireType.SignedVariant: return Zag(ReadUInt32Varint(Read32VarintMode.Signed)); default: ThrowWireTypeException(); return 0; } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public long ReadInt64() { switch (_reader.WireType) { case WireType.Variant: return (long)ReadUInt64Varint(); case WireType.Fixed32: return (int)_reader.ImplReadUInt32Fixed(ref this); case WireType.Fixed64: return (long)_reader.ImplReadUInt64Fixed(ref this); case WireType.SignedVariant: return Zag(ReadUInt64Varint()); default: ThrowWireTypeException(); return 0L; } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public unsafe double ReadDouble() { switch (_reader.WireType) { case WireType.Fixed32: return ReadSingle(); case WireType.Fixed64: { long num = ReadInt64(); return *(double*)(&num); } default: ThrowWireTypeException(); return 0.0; } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public unsafe float ReadSingle() { switch (_reader.WireType) { case WireType.Fixed32: { int num3 = ReadInt32(); return *(float*)(&num3); } case WireType.Fixed64: { double num = ReadDouble(); float num2 = (float)num; if (float.IsInfinity(num2) && !double.IsInfinity(num)) { ThrowOverflow(); } return num2; } default: ThrowWireTypeException(); return 0f; } } [MethodImpl(MethodImplOptions.AggressiveInlining)] private void PrepareToReadRepeated<T>(ref SerializerFeatures features, SerializerFeatures serializerFeatures, out SerializerFeatures category, out bool packed) { if (serializerFeatures.IsRepeated()) { TypeModel.ThrowNestedListsNotSupported(typeof(T)); } features.InheritFrom(serializerFeatures); category = serializerFeatures.GetCategory(); packed = false; if (TypeHelper<T>.CanBePacked && WireType == WireType.String && !features.HasAny(SerializerFeatures.OptionWrappedValue)) { if (category != SerializerFeatures.CategoryScalar) { ThrowInvalidOperationException("Packed data expected a scalar serializer"); } packed = true; } } [MethodImpl(MethodImplOptions.AggressiveInlining)] private void ReadRepeatedCore<TSerializer, TList, T>(ref TList values, SerializerFeatures category, WireType wireType, in TSerializer serializer, SerializerFeatures features) where TSerializer : ISerializer<T> where TList : ICollection<T> { int fieldNumber = FieldNumber; bool flag = features.HasAny(SerializerFeatures.OptionWrappedValue); T value = features.DefaultFor<T>(); do { T item; if (flag) { item = ReadWrapped(features, value, serializer); } else { switch (category) { case SerializerFeatures.CategoryScalar: Hint(wireType); item = serializer.Read(ref this, value); break; case SerializerFeatures.CategoryMessage: case SerializerFeatures.CategoryMessageWrappedAtRoot: item = ReadMessage(SerializerFeatures.CategoryRepeated, value, in serializer); break; default: category.ThrowInvalidCategory(); item = default(T); break; } } values.Add(item); } while (TryReadFieldHeader(fieldNumber)); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private void ReadPackedScalar<TSerializer, TList, T>(ref TList list, WireType wireType, in TSerializer serializer) where TSerializer : ISerializer<T> where TList : ICollection<T> { int num = (int)ReadUInt32Varint(Read32VarintMode.Unsigned); if (num == 0) { return; } if (num < 0) { ThrowInvalidLength(num); } int num2; if (wireType <= WireType.Fixed64) { if (wireType == WireType.Variant) { goto IL_00ff; } if (wireType == WireType.Fixed64) { if (num % 8 != 0) { ThrowHelper.ThrowInvalidOperationException("packed length should be multiple of 8"); } num2 = num / 8; goto IL_0065; } } else { if (wireType == WireType.Fixed32) { if (num % 4 != 0) { ThrowHelper.ThrowInvalidOperationException("packed length should be multiple of 4"); } num2 = num / 4; goto IL_0065; } if (wireType == WireType.SignedVariant) { goto IL_00ff; } } ThrowHelper.ThrowInvalidPackedOperationException(WireType, typeof(T)); return; IL_00ff: long num3 = GetPosition() + num; TList val; TSerializer val2; do { _reader.WireType = wireType; ref TList reference = ref list; val = default(TList); if (val == null) { val = reference; reference = ref val; } val2 = serializer; reference.Add(val2.Read(ref this, default(T))); } while (GetPosition() < num3); if (GetPosition() != num3) { ThrowHelper.ThrowInvalidOperationException("over-read packed data"); } return; IL_0065: if ((object)list is List<T> list2) { list2.Capacity = Math.Max(list2.Capacity, list2.Count + Math.Min(num2, 8192)); } for (int i = 0; i < num2; i++) { _reader.WireType = wireType; ref TList reference2 = ref list; val = default(TList); if (val == null) { val = reference2; reference2 = ref val; } val2 = serializer; reference2.Add(val2.Read(ref this, default(T))); } } internal ReadBuffer<T> FillBuffer<TSerializer, T>(SerializerFeatures features, in TSerializer serializer, T initialValue) where TSerializer : ISerializer<T> { PrepareToReadRepeated<T>(ref features, serializer.Features, out var category, out var packed); ReadBuffer<T> list = ReadBuffer<T>.Create(); try { WireType wireType = features.GetWireType(); if (packed) { ReadPackedScalar<TSerializer, ReadBuffer<T>, T>(ref list, wireType, in serializer); } else { ReadRepeatedCore<TSerializer, ReadBuffer<T>, T>(ref list, category, wireType, in serializer, features); } return list; } catch { try { list.Dispose(); } catch { } throw; } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool ReadBoolean() { return ReadUInt32() != 0; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public ulong ReadUInt64() { switch (_reader.WireType) { case WireType.Variant: return ReadUInt64Varint(); case WireType.Fixed32: return _reader.ImplReadUInt32Fixed(ref this); case WireType.Fixed64: return _reader.ImplReadUInt64Fixed(ref this); default: ThrowWireTypeException(); return 0uL; } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public byte[] AppendBytes(byte[] value) { return AppendBytesImpl(value, DefaultMemoryConverter<byte>.Instance); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public ReadOnlyMemory<byte> AppendBytes(ReadOnlyMemory<byte> value) { return AppendBytesImpl(value, DefaultMemoryConverter<byte>.Instance); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public Memory<byte> AppendBytes(Memory<byte> value) { return AppendBytesImpl(value, DefaultMemoryConverter<byte>.Instance); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public ArraySegment<byte> AppendBytes(ArraySegment<byte> value) { return AppendBytesImpl(value, DefaultMemoryConverter<byte>.Instance); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public TStorage AppendBytes<TStorage>(TStorage value, IMemoryConverter<TStorage, byte> converter = null) { return AppendBytesImpl(value, converter ?? DefaultMemoryConverter<byte>.GetFor<TStorage>(Model)); } private TStorage AppendBytesImpl<TStorage>(TStorage value, IMemoryConverter<TStorage, byte> converter) { WireType wireType = _reader.WireType; if (wireType == WireType.String) { int num = (int)ReadUInt32Varint(Read32VarintMode.Signed); _reader.WireType = WireType.None; if (num == 0) { return converter.NonNull(in value); } if (num < 0) { ThrowInvalidLength(num); } Memory<byte> memory = converter.Expand(Context, ref value, num); _reader.ImplReadBytes(ref this, memory.Span); return value; } ThrowWireTypeException(); return default(TStorage); } [Browsable(false)] public Span<byte> ReadBytes(Span<byte> destination) { ReadBytes(destination, out var length); return destination.Slice(0, length); } public void ReadBytes(Span<byte> destination, out int length) { WireType wireType = _reader.WireType; if (wireType == WireType.String) { length = (int)ReadUInt32Varint(Read32VarintMode.Signed); if (length < 0) { ThrowInvalidLength(length); } if (length > destination.Length) { ThrowHelper.ThrowInvalidOperationException($"Insufficient space in the target span to read a string/bytes value; {destination.Length} vs {length} bytes"); } _reader.WireType = WireType.None; destination = destination.Slice(0, length); _reader.ImplReadBytes(ref this, destination); } else { length = 0; ThrowWireTypeException(); } } [MethodImpl(MethodImplOptions.NoInlining)] public SubItemToken StartSubItem() { ProtoReader reader = _reader; switch (_reader.WireType) { case WireType.StartGroup: reader.WireType = WireType.None; if (reader.IncrDepth()) { ThrowTooDeep(); } return new SubItemToken(-reader._fieldNumber); case WireType.String: { long num = (long)ReadUInt64Varint(); if (num < 0) { ThrowInvalidOperationException(); } long blockEnd = reader.blockEnd64; reader.blockEnd64 = reader._longPosition + num; if (reader.IncrDepth()) { ThrowTooDeep(); } return new SubItemToken(blockEnd); } default: ThrowWireTypeException(); return default(SubItemToken); } } [MethodImpl(MethodImplOptions.NoInlining)] public void EndSubItem(SubItemToken token) { long value = token.value64; ProtoReader reader = _reader; WireType wireType = reader.WireType; if (wireType == WireType.EndGroup) { if (value >= 0) { ThrowProtoException("A length-based message was terminated via end-group; this indicates data corruption"); } if (-(int)value != reader._fieldNumber) { ThrowProtoException("Wrong group was ended"); } reader.WireType = WireType.None; reader.DecrDepth(); return; } long longPosition = reader._longPosition; if (value < longPosition) { ThrowProtoException($"Sub-message not read entirely; expected {value}, was {longPosition}"); } if (reader.blockEnd64 != longPosition && reader.blockEnd64 != long.MaxValue) { ThrowProtoException($"Sub-message not read correctly (end {reader.blockEnd64} vs {longPosition})"); } reader.blockEnd64 = value; reader.DecrDepth(); } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal object ReadObject(object value, Type type) { return ReadTypedObject(value, type); } [MethodImpl(MethodImplOptions.NoInlining)] internal object ReadTypedObject(object value, Type type) { TypeModel model = Model; if (model == null) { ThrowInvalidOperationException("Cannot deserialize sub-objects unless a model is provided"); } if (DynamicStub.TryDeserialize(ObjectScope.WrappedMessage, type, model, ref this, ref value)) { return value; } SubItemToken token = StartSubItem(); if ((object)type == null || !model.TryDeserializeAuxiliaryType(ref this, DataFormat.Default, 1, type, ref value, skipOtherFields: true, asListItem: false, autoCreate: true, insideList: false, null, isRoot: false)) { TypeModel.ThrowUnexpectedType(type, Model); } EndSubItem(token); return value; } internal void SkipAllFields() { while (ReadFieldHeader() > 0) { SkipField(); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public string ReadString(StringMap map = null) { if (_reader.WireType == WireType.String) { int num = (int)ReadUInt32Varint(Read32VarintMode.Unsigned); if (num == 0) { return ""; } if (num < 0) { ThrowInvalidLength(num); } string text = _reader.ImplReadString(ref this, num); if (_reader.InternStrings) { text = _reader.Intern(text); } return text; } ThrowWireTypeException(); return null; } [MethodImpl(MethodImplOptions.AggressiveInlining)] private uint ReadUInt32Varint(Read32VarintMode mode) { uint value; int num = _reader.ImplTryReadUInt32VarintWithoutMoving(ref this, mode, out value); if (num <= 0) { if (mode == Read32VarintMode.FieldHeader) { return 0u; } ThrowEoF(); } _reader.ImplSkipBytes(ref this, num); return value; } [MethodImpl(MethodImplOptions.AggressiveInlining)] private ulong ReadUInt64Varint() { ulong value; int num = _reader.ImplTryReadUInt64VarintWithoutMoving(ref this, out value); if (num <= 0) { ThrowEoF(); } _reader.ImplSkipBytes(ref this, num); return value; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Assert
plugins/System.Buffers.dll
Decompiled 16 hours agousing System; using System.Diagnostics; using System.Diagnostics.Tracing; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Security; using System.Security.Permissions; using System.Threading; using FxResources.System.Buffers; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: NeutralResourcesLanguage("en-US")] [assembly: AssemblyTitle("System.Buffers")] [assembly: AssemblyDescription("System.Buffers")] [assembly: AssemblyDefaultAlias("System.Buffers")] [assembly: AssemblyCompany("Microsoft Corporation")] [assembly: AssemblyProduct("Microsoft® .NET Framework")] [assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")] [assembly: AssemblyFileVersion("4.6.28619.01")] [assembly: AssemblyInformationalVersion("4.6.28619.01 @BuiltBy: dlab14-DDVSOWINAGE069 @Branch: release/2.1 @SrcCode: https://github.com/dotnet/corefx/tree/7601f4f6225089ffb291dc7d58293c7bbf5c5d4f")] [assembly: CLSCompliant(true)] [assembly: AssemblyMetadata(".NETFrameworkAssembly", "")] [assembly: AssemblyMetadata("Serviceable", "True")] [assembly: AssemblyMetadata("PreferInbox", "True")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("4.0.3.0")] [module: UnverifiableCode] namespace FxResources.System.Buffers { internal static class SR { } } namespace System { internal static class SR { private static ResourceManager s_resourceManager; private static ResourceManager ResourceManager => s_resourceManager ?? (s_resourceManager = new ResourceManager(ResourceType)); internal static Type ResourceType { get; } = typeof(SR); internal static string ArgumentException_BufferNotFromPool => GetResourceString("ArgumentException_BufferNotFromPool", null); [MethodImpl(MethodImplOptions.NoInlining)] private static bool UsingResourceKeys() { return false; } internal static string GetResourceString(string resourceKey, string defaultString) { string text = null; try { text = ResourceManager.GetString(resourceKey); } catch (MissingManifestResourceException) { } if (defaultString != null && resourceKey.Equals(text, StringComparison.Ordinal)) { return defaultString; } return text; } internal static string Format(string resourceFormat, params object[] args) { if (args != null) { if (UsingResourceKeys()) { return resourceFormat + string.Join(", ", args); } return string.Format(resourceFormat, args); } return resourceFormat; } internal static string Format(string resourceFormat, object p1) { if (UsingResourceKeys()) { return string.Join(", ", resourceFormat, p1); } return string.Format(resourceFormat, p1); } internal static string Format(string resourceFormat, object p1, object p2) { if (UsingResourceKeys()) { return string.Join(", ", resourceFormat, p1, p2); } return string.Format(resourceFormat, p1, p2); } internal static string Format(string resourceFormat, object p1, object p2, object p3) { if (UsingResourceKeys()) { return string.Join(", ", resourceFormat, p1, p2, p3); } return string.Format(resourceFormat, p1, p2, p3); } } } namespace System.Buffers { public abstract class ArrayPool<T> { private static ArrayPool<T> s_sharedInstance; public static ArrayPool<T> Shared { [MethodImpl(MethodImplOptions.AggressiveInlining)] get { return Volatile.Read(ref s_sharedInstance) ?? EnsureSharedCreated(); } } [MethodImpl(MethodImplOptions.NoInlining)] private static ArrayPool<T> EnsureSharedCreated() { Interlocked.CompareExchange(ref s_sharedInstance, Create(), null); return s_sharedInstance; } public static ArrayPool<T> Create() { return new DefaultArrayPool<T>(); } public static ArrayPool<T> Create(int maxArrayLength, int maxArraysPerBucket) { return new DefaultArrayPool<T>(maxArrayLength, maxArraysPerBucket); } public abstract T[] Rent(int minimumLength); public abstract void Return(T[] array, bool clearArray = false); } [EventSource(Name = "System.Buffers.ArrayPoolEventSource")] internal sealed class ArrayPoolEventSource : EventSource { internal enum BufferAllocatedReason { Pooled, OverMaximumSize, PoolExhausted } internal static readonly System.Buffers.ArrayPoolEventSource Log = new System.Buffers.ArrayPoolEventSource(); [Event(1, Level = EventLevel.Verbose)] internal unsafe void BufferRented(int bufferId, int bufferSize, int poolId, int bucketId) { EventData* ptr = stackalloc EventData[4]; *ptr = new EventData { Size = 4, DataPointer = (IntPtr)(&bufferId) }; ptr[1] = new EventData { Size = 4, DataPointer = (IntPtr)(&bufferSize) }; ptr[2] = new EventData { Size = 4, DataPointer = (IntPtr)(&poolId) }; ptr[3] = new EventData { Size = 4, DataPointer = (IntPtr)(&bucketId) }; WriteEventCore(1, 4, ptr); } [Event(2, Level = EventLevel.Informational)] internal unsafe void BufferAllocated(int bufferId, int bufferSize, int poolId, int bucketId, BufferAllocatedReason reason) { EventData* ptr = stackalloc EventData[5]; *ptr = new EventData { Size = 4, DataPointer = (IntPtr)(&bufferId) }; ptr[1] = new EventData { Size = 4, DataPointer = (IntPtr)(&bufferSize) }; ptr[2] = new EventData { Size = 4, DataPointer = (IntPtr)(&poolId) }; ptr[3] = new EventData { Size = 4, DataPointer = (IntPtr)(&bucketId) }; ptr[4] = new EventData { Size = 4, DataPointer = (IntPtr)(&reason) }; WriteEventCore(2, 5, ptr); } [Event(3, Level = EventLevel.Verbose)] internal void BufferReturned(int bufferId, int bufferSize, int poolId) { WriteEvent(3, bufferId, bufferSize, poolId); } } internal sealed class DefaultArrayPool<T> : ArrayPool<T> { private sealed class Bucket { internal readonly int _bufferLength; private readonly T[][] _buffers; private readonly int _poolId; private SpinLock _lock; private int _index; internal int Id => GetHashCode(); internal Bucket(int bufferLength, int numberOfBuffers, int poolId) { _lock = new SpinLock(Debugger.IsAttached); _buffers = new T[numberOfBuffers][]; _bufferLength = bufferLength; _poolId = poolId; } internal T[] Rent() { T[][] buffers = _buffers; T[] array = null; bool lockTaken = false; bool flag = false; try { _lock.Enter(ref lockTaken); if (_index < buffers.Length) { array = buffers[_index]; buffers[_index++] = null; flag = array == null; } } finally { if (lockTaken) { _lock.Exit(useMemoryBarrier: false); } } if (flag) { array = new T[_bufferLength]; System.Buffers.ArrayPoolEventSource log = System.Buffers.ArrayPoolEventSource.Log; if (log.IsEnabled()) { log.BufferAllocated(array.GetHashCode(), _bufferLength, _poolId, Id, System.Buffers.ArrayPoolEventSource.BufferAllocatedReason.Pooled); } } return array; } internal void Return(T[] array) { if (array.Length != _bufferLength) { throw new ArgumentException(System.SR.ArgumentException_BufferNotFromPool, "array"); } bool lockTaken = false; try { _lock.Enter(ref lockTaken); if (_index != 0) { _buffers[--_index] = array; } } finally { if (lockTaken) { _lock.Exit(useMemoryBarrier: false); } } } } private const int DefaultMaxArrayLength = 1048576; private const int DefaultMaxNumberOfArraysPerBucket = 50; private static T[] s_emptyArray; private readonly Bucket[] _buckets; private int Id => GetHashCode(); internal DefaultArrayPool() : this(1048576, 50) { } internal DefaultArrayPool(int maxArrayLength, int maxArraysPerBucket) { if (maxArrayLength <= 0) { throw new ArgumentOutOfRangeException("maxArrayLength"); } if (maxArraysPerBucket <= 0) { throw new ArgumentOutOfRangeException("maxArraysPerBucket"); } if (maxArrayLength > 1073741824) { maxArrayLength = 1073741824; } else if (maxArrayLength < 16) { maxArrayLength = 16; } int id = Id; int num = System.Buffers.Utilities.SelectBucketIndex(maxArrayLength); Bucket[] array = new Bucket[num + 1]; for (int i = 0; i < array.Length; i++) { array[i] = new Bucket(System.Buffers.Utilities.GetMaxSizeForBucket(i), maxArraysPerBucket, id); } _buckets = array; } public override T[] Rent(int minimumLength) { if (minimumLength < 0) { throw new ArgumentOutOfRangeException("minimumLength"); } if (minimumLength == 0) { return s_emptyArray ?? (s_emptyArray = new T[0]); } System.Buffers.ArrayPoolEventSource log = System.Buffers.ArrayPoolEventSource.Log; T[] array = null; int num = System.Buffers.Utilities.SelectBucketIndex(minimumLength); if (num < _buckets.Length) { int num2 = num; do { array = _buckets[num2].Rent(); if (array != null) { if (log.IsEnabled()) { log.BufferRented(array.GetHashCode(), array.Length, Id, _buckets[num2].Id); } return array; } } while (++num2 < _buckets.Length && num2 != num + 2); array = new T[_buckets[num]._bufferLength]; } else { array = new T[minimumLength]; } if (log.IsEnabled()) { int hashCode = array.GetHashCode(); int bucketId = -1; log.BufferRented(hashCode, array.Length, Id, bucketId); log.BufferAllocated(hashCode, array.Length, Id, bucketId, (num >= _buckets.Length) ? System.Buffers.ArrayPoolEventSource.BufferAllocatedReason.OverMaximumSize : System.Buffers.ArrayPoolEventSource.BufferAllocatedReason.PoolExhausted); } return array; } public override void Return(T[] array, bool clearArray = false) { if (array == null) { throw new ArgumentNullException("array"); } if (array.Length == 0) { return; } int num = System.Buffers.Utilities.SelectBucketIndex(array.Length); if (num < _buckets.Length) { if (clearArray) { Array.Clear(array, 0, array.Length); } _buckets[num].Return(array); } System.Buffers.ArrayPoolEventSource log = System.Buffers.ArrayPoolEventSource.Log; if (log.IsEnabled()) { log.BufferReturned(array.GetHashCode(), array.Length, Id); } } } internal static class Utilities { [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static int SelectBucketIndex(int bufferSize) { uint num = (uint)(bufferSize - 1) >> 4; int num2 = 0; if (num > 65535) { num >>= 16; num2 = 16; } if (num > 255) { num >>= 8; num2 += 8; } if (num > 15) { num >>= 4; num2 += 4; } if (num > 3) { num >>= 2; num2 += 2; } if (num > 1) { num >>= 1; num2++; } return num2 + (int)num; } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static int GetMaxSizeForBucket(int binIndex) { return 16 << binIndex; } } }
plugins/System.Collections.Immutable.dll
Decompiled 16 hours ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections.Generic; using System.Collections.Immutable; using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Threading; using FxResources.System.Collections.Immutable; using Microsoft.CodeAnalysis; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: InternalsVisibleTo("System.Collections.Immutable.Tests, PublicKey=00240000048000009400000006020000002400005253413100040000010001004b86c4cb78549b34bab61a3b1800e23bfeb5b3ec390074041536a7e3cbd97f5f04cf0f857155a8928eaa29ebfd11cfbbad3ba70efea7bda3226c6a8d370a4cd303f714486b6ebc225985a638471e6ef571cc92a4613c00b8fa65d61ccee0cbe5f36330c9a01f4183559f1bef24cc2917c6d913e3a541333a1d05d9bed22b38cb")] [assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")] [assembly: AssemblyMetadata(".NETFrameworkAssembly", "")] [assembly: AssemblyMetadata("Serviceable", "True")] [assembly: AssemblyMetadata("PreferInbox", "True")] [assembly: AssemblyDefaultAlias("System.Collections.Immutable")] [assembly: NeutralResourcesLanguage("en-US")] [assembly: CLSCompliant(true)] [assembly: AssemblyMetadata("IsTrimmable", "True")] [assembly: DefaultDllImportSearchPaths(DllImportSearchPath.System32 | DllImportSearchPath.AssemblyDirectory)] [assembly: AssemblyCompany("Microsoft Corporation")] [assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")] [assembly: AssemblyDescription("This package provides collections that are thread safe and guaranteed to never change their contents, also known as immutable collections. Like strings, any methods that perform modifications will not change the existing instance but instead return a new instance. For efficiency reasons, the implementation uses a sharing mechanism to ensure that newly created instances share as much data as possible with the previous instance while ensuring that operations have a predictable time complexity.\r\n\r\nThe System.Collections.Immutable library is built-in as part of the shared framework in .NET Runtime. The package can be installed when you need to use it in other target frameworks.")] [assembly: AssemblyFileVersion("7.0.22.51805")] [assembly: AssemblyInformationalVersion("7.0.0+d099f075e45d2aa6007a22b71b45a08758559f80")] [assembly: AssemblyProduct("Microsoft® .NET")] [assembly: AssemblyTitle("System.Collections.Immutable")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/dotnet/runtime")] [assembly: AssemblyVersion("7.0.0.0")] [module: RefSafetyRules(11)] [module: System.Runtime.CompilerServices.NullablePublicOnly(true)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class IsReadOnlyAttribute : Attribute { } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class NullablePublicOnlyAttribute : Attribute { public readonly bool IncludesInternals; public NullablePublicOnlyAttribute(bool P_0) { IncludesInternals = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace FxResources.System.Collections.Immutable { internal static class SR { } } namespace System { internal static class SR { private static readonly bool s_usingResourceKeys = AppContext.TryGetSwitch("System.Resources.UseSystemResourceKeys", out var isEnabled) && isEnabled; private static ResourceManager s_resourceManager; internal static ResourceManager ResourceManager => s_resourceManager ?? (s_resourceManager = new ResourceManager(typeof(SR))); internal static string Arg_KeyNotFoundWithKey => GetResourceString("Arg_KeyNotFoundWithKey"); internal static string ArrayInitializedStateNotEqual => GetResourceString("ArrayInitializedStateNotEqual"); internal static string ArrayLengthsNotEqual => GetResourceString("ArrayLengthsNotEqual"); internal static string CannotFindOldValue => GetResourceString("CannotFindOldValue"); internal static string CapacityMustBeGreaterThanOrEqualToCount => GetResourceString("CapacityMustBeGreaterThanOrEqualToCount"); internal static string CapacityMustEqualCountOnMove => GetResourceString("CapacityMustEqualCountOnMove"); internal static string CollectionModifiedDuringEnumeration => GetResourceString("CollectionModifiedDuringEnumeration"); internal static string DuplicateKey => GetResourceString("DuplicateKey"); internal static string InvalidEmptyOperation => GetResourceString("InvalidEmptyOperation"); internal static string InvalidOperationOnDefaultArray => GetResourceString("InvalidOperationOnDefaultArray"); private static bool UsingResourceKeys() { return s_usingResourceKeys; } internal static string GetResourceString(string resourceKey) { if (UsingResourceKeys()) { return resourceKey; } string result = null; try { result = ResourceManager.GetString(resourceKey); } catch (MissingManifestResourceException) { } return result; } internal static string GetResourceString(string resourceKey, string defaultString) { string resourceString = GetResourceString(resourceKey); if (!(resourceKey == resourceString) && resourceString != null) { return resourceString; } return defaultString; } internal static string Format(string resourceFormat, object? p1) { if (UsingResourceKeys()) { return string.Join(", ", resourceFormat, p1); } return string.Format(resourceFormat, p1); } internal static string Format(string resourceFormat, object? p1, object? p2) { if (UsingResourceKeys()) { return string.Join(", ", resourceFormat, p1, p2); } return string.Format(resourceFormat, p1, p2); } internal static string Format(string resourceFormat, object? p1, object? p2, object? p3) { if (UsingResourceKeys()) { return string.Join(", ", resourceFormat, p1, p2, p3); } return string.Format(resourceFormat, p1, p2, p3); } internal static string Format(string resourceFormat, params object?[]? args) { if (args != null) { if (UsingResourceKeys()) { return resourceFormat + ", " + string.Join(", ", args); } return string.Format(resourceFormat, args); } return resourceFormat; } internal static string Format(IFormatProvider? provider, string resourceFormat, object? p1) { if (UsingResourceKeys()) { return string.Join(", ", resourceFormat, p1); } return string.Format(provider, resourceFormat, p1); } internal static string Format(IFormatProvider? provider, string resourceFormat, object? p1, object? p2) { if (UsingResourceKeys()) { return string.Join(", ", resourceFormat, p1, p2); } return string.Format(provider, resourceFormat, p1, p2); } internal static string Format(IFormatProvider? provider, string resourceFormat, object? p1, object? p2, object? p3) { if (UsingResourceKeys()) { return string.Join(", ", resourceFormat, p1, p2, p3); } return string.Format(provider, resourceFormat, p1, p2, p3); } internal static string Format(IFormatProvider? provider, string resourceFormat, params object?[]? args) { if (args != null) { if (UsingResourceKeys()) { return resourceFormat + ", " + string.Join(", ", args); } return string.Format(provider, resourceFormat, args); } return resourceFormat; } } } namespace System.Diagnostics.CodeAnalysis { [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, Inherited = false)] internal sealed class AllowNullAttribute : Attribute { } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, Inherited = false)] internal sealed class DisallowNullAttribute : Attribute { } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.ReturnValue, Inherited = false)] internal sealed class MaybeNullAttribute : Attribute { } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.ReturnValue, Inherited = false)] internal sealed class NotNullAttribute : Attribute { } [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] internal sealed class MaybeNullWhenAttribute : Attribute { public bool ReturnValue { get; } public MaybeNullWhenAttribute(bool returnValue) { ReturnValue = returnValue; } } [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] internal sealed class NotNullWhenAttribute : Attribute { public bool ReturnValue { get; } public NotNullWhenAttribute(bool returnValue) { ReturnValue = returnValue; } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Parameter | AttributeTargets.ReturnValue, AllowMultiple = true, Inherited = false)] internal sealed class NotNullIfNotNullAttribute : Attribute { public string ParameterName { get; } public NotNullIfNotNullAttribute(string parameterName) { ParameterName = parameterName; } } [AttributeUsage(AttributeTargets.Method, Inherited = false)] internal sealed class DoesNotReturnAttribute : Attribute { } [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] internal sealed class DoesNotReturnIfAttribute : Attribute { public bool ParameterValue { get; } public DoesNotReturnIfAttribute(bool parameterValue) { ParameterValue = parameterValue; } } [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)] internal sealed class MemberNotNullAttribute : Attribute { public string[] Members { get; } public MemberNotNullAttribute(string member) { Members = new string[1] { member }; } public MemberNotNullAttribute(params string[] members) { Members = members; } } [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)] internal sealed class MemberNotNullWhenAttribute : Attribute { public bool ReturnValue { get; } public string[] Members { get; } public MemberNotNullWhenAttribute(bool returnValue, string member) { ReturnValue = returnValue; Members = new string[1] { member }; } public MemberNotNullWhenAttribute(bool returnValue, params string[] members) { ReturnValue = returnValue; Members = members; } } } namespace System.Runtime.InteropServices { [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] internal sealed class LibraryImportAttribute : Attribute { public string LibraryName { get; } public string? EntryPoint { get; set; } public StringMarshalling StringMarshalling { get; set; } public Type? StringMarshallingCustomType { get; set; } public bool SetLastError { get; set; } public LibraryImportAttribute(string libraryName) { LibraryName = libraryName; } } internal enum StringMarshalling { Custom, Utf8, Utf16 } } namespace System.Runtime.Versioning { [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Constructor | AttributeTargets.Method, AllowMultiple = false, Inherited = false)] internal sealed class NonVersionableAttribute : Attribute { } } namespace System.Linq { public static class ImmutableArrayExtensions { public static IEnumerable<TResult> Select<T, TResult>(this ImmutableArray<T> immutableArray, Func<T, TResult> selector) { immutableArray.ThrowNullRefIfNotInitialized(); return immutableArray.array.Select(selector); } public static IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(this ImmutableArray<TSource> immutableArray, Func<TSource, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector) { immutableArray.ThrowNullRefIfNotInitialized(); if (collectionSelector == null || resultSelector == null) { return Enumerable.SelectMany(immutableArray, collectionSelector, resultSelector); } if (immutableArray.Length != 0) { return immutableArray.SelectManyIterator(collectionSelector, resultSelector); } return Enumerable.Empty<TResult>(); } public static IEnumerable<T> Where<T>(this ImmutableArray<T> immutableArray, Func<T, bool> predicate) { immutableArray.ThrowNullRefIfNotInitialized(); return immutableArray.array.Where(predicate); } public static bool Any<T>(this ImmutableArray<T> immutableArray) { return immutableArray.Length > 0; } public static bool Any<T>(this ImmutableArray<T> immutableArray, Func<T, bool> predicate) { immutableArray.ThrowNullRefIfNotInitialized(); Requires.NotNull(predicate, "predicate"); T[] array = immutableArray.array; foreach (T arg in array) { if (predicate(arg)) { return true; } } return false; } public static bool All<T>(this ImmutableArray<T> immutableArray, Func<T, bool> predicate) { immutableArray.ThrowNullRefIfNotInitialized(); Requires.NotNull(predicate, "predicate"); T[] array = immutableArray.array; foreach (T arg in array) { if (!predicate(arg)) { return false; } } return true; } public static bool SequenceEqual<TDerived, TBase>(this ImmutableArray<TBase> immutableArray, ImmutableArray<TDerived> items, IEqualityComparer<TBase>? comparer = null) where TDerived : TBase { immutableArray.ThrowNullRefIfNotInitialized(); items.ThrowNullRefIfNotInitialized(); if (immutableArray.array == items.array) { return true; } if (immutableArray.Length != items.Length) { return false; } if (comparer == null) { comparer = EqualityComparer<TBase>.Default; } for (int i = 0; i < immutableArray.Length; i++) { if (!comparer.Equals(immutableArray.array[i], (TBase)(object)items.array[i])) { return false; } } return true; } public static bool SequenceEqual<TDerived, TBase>(this ImmutableArray<TBase> immutableArray, IEnumerable<TDerived> items, IEqualityComparer<TBase>? comparer = null) where TDerived : TBase { Requires.NotNull(items, "items"); if (comparer == null) { comparer = EqualityComparer<TBase>.Default; } int num = 0; int length = immutableArray.Length; foreach (TDerived item in items) { if (num == length) { return false; } if (!comparer.Equals(immutableArray[num], (TBase)(object)item)) { return false; } num++; } return num == length; } public static bool SequenceEqual<TDerived, TBase>(this ImmutableArray<TBase> immutableArray, ImmutableArray<TDerived> items, Func<TBase, TBase, bool> predicate) where TDerived : TBase { Requires.NotNull(predicate, "predicate"); immutableArray.ThrowNullRefIfNotInitialized(); items.ThrowNullRefIfNotInitialized(); if (immutableArray.array == items.array) { return true; } if (immutableArray.Length != items.Length) { return false; } int i = 0; for (int length = immutableArray.Length; i < length; i++) { if (!predicate(immutableArray[i], (TBase)(object)items[i])) { return false; } } return true; } public static T? Aggregate<T>(this ImmutableArray<T> immutableArray, Func<T, T, T> func) { Requires.NotNull(func, "func"); if (immutableArray.Length == 0) { return default(T); } T val = immutableArray[0]; int i = 1; for (int length = immutableArray.Length; i < length; i++) { val = func(val, immutableArray[i]); } return val; } public static TAccumulate Aggregate<TAccumulate, T>(this ImmutableArray<T> immutableArray, TAccumulate seed, Func<TAccumulate, T, TAccumulate> func) { Requires.NotNull(func, "func"); TAccumulate val = seed; T[] array = immutableArray.array; foreach (T arg in array) { val = func(val, arg); } return val; } public static TResult Aggregate<TAccumulate, TResult, T>(this ImmutableArray<T> immutableArray, TAccumulate seed, Func<TAccumulate, T, TAccumulate> func, Func<TAccumulate, TResult> resultSelector) { Requires.NotNull(resultSelector, "resultSelector"); return resultSelector(immutableArray.Aggregate(seed, func)); } public static T ElementAt<T>(this ImmutableArray<T> immutableArray, int index) { return immutableArray[index]; } public static T? ElementAtOrDefault<T>(this ImmutableArray<T> immutableArray, int index) { if (index < 0 || index >= immutableArray.Length) { return default(T); } return immutableArray[index]; } public static T First<T>(this ImmutableArray<T> immutableArray, Func<T, bool> predicate) { Requires.NotNull(predicate, "predicate"); T[] array = immutableArray.array; foreach (T val in array) { if (predicate(val)) { return val; } } return Enumerable.Empty<T>().First(); } public static T First<T>(this ImmutableArray<T> immutableArray) { if (immutableArray.Length <= 0) { return immutableArray.array.First(); } return immutableArray[0]; } public static T? FirstOrDefault<T>(this ImmutableArray<T> immutableArray) { if (immutableArray.array.Length == 0) { return default(T); } return immutableArray.array[0]; } public static T? FirstOrDefault<T>(this ImmutableArray<T> immutableArray, Func<T, bool> predicate) { Requires.NotNull(predicate, "predicate"); T[] array = immutableArray.array; foreach (T val in array) { if (predicate(val)) { return val; } } return default(T); } public static T Last<T>(this ImmutableArray<T> immutableArray) { if (immutableArray.Length <= 0) { return immutableArray.array.Last(); } return immutableArray[immutableArray.Length - 1]; } public static T Last<T>(this ImmutableArray<T> immutableArray, Func<T, bool> predicate) { Requires.NotNull(predicate, "predicate"); for (int num = immutableArray.Length - 1; num >= 0; num--) { if (predicate(immutableArray[num])) { return immutableArray[num]; } } return Enumerable.Empty<T>().Last(); } public static T? LastOrDefault<T>(this ImmutableArray<T> immutableArray) { immutableArray.ThrowNullRefIfNotInitialized(); return immutableArray.array.LastOrDefault(); } public static T? LastOrDefault<T>(this ImmutableArray<T> immutableArray, Func<T, bool> predicate) { Requires.NotNull(predicate, "predicate"); for (int num = immutableArray.Length - 1; num >= 0; num--) { if (predicate(immutableArray[num])) { return immutableArray[num]; } } return default(T); } public static T Single<T>(this ImmutableArray<T> immutableArray) { immutableArray.ThrowNullRefIfNotInitialized(); return immutableArray.array.Single(); } public static T Single<T>(this ImmutableArray<T> immutableArray, Func<T, bool> predicate) { Requires.NotNull(predicate, "predicate"); bool flag = true; T result = default(T); T[] array = immutableArray.array; foreach (T val in array) { if (predicate(val)) { if (!flag) { ImmutableArray.TwoElementArray.Single(); } flag = false; result = val; } } if (flag) { Enumerable.Empty<T>().Single(); } return result; } public static T? SingleOrDefault<T>(this ImmutableArray<T> immutableArray) { immutableArray.ThrowNullRefIfNotInitialized(); return immutableArray.array.SingleOrDefault(); } public static T? SingleOrDefault<T>(this ImmutableArray<T> immutableArray, Func<T, bool> predicate) { Requires.NotNull(predicate, "predicate"); bool flag = true; T result = default(T); T[] array = immutableArray.array; foreach (T val in array) { if (predicate(val)) { if (!flag) { ImmutableArray.TwoElementArray.Single(); } flag = false; result = val; } } return result; } public static Dictionary<TKey, T> ToDictionary<TKey, T>(this ImmutableArray<T> immutableArray, Func<T, TKey> keySelector) where TKey : notnull { return immutableArray.ToDictionary(keySelector, EqualityComparer<TKey>.Default); } public static Dictionary<TKey, TElement> ToDictionary<TKey, TElement, T>(this ImmutableArray<T> immutableArray, Func<T, TKey> keySelector, Func<T, TElement> elementSelector) where TKey : notnull { return immutableArray.ToDictionary(keySelector, elementSelector, EqualityComparer<TKey>.Default); } public static Dictionary<TKey, T> ToDictionary<TKey, T>(this ImmutableArray<T> immutableArray, Func<T, TKey> keySelector, IEqualityComparer<TKey>? comparer) where TKey : notnull { Requires.NotNull(keySelector, "keySelector"); Dictionary<TKey, T> dictionary = new Dictionary<TKey, T>(immutableArray.Length, comparer); ImmutableArray<T>.Enumerator enumerator = immutableArray.GetEnumerator(); while (enumerator.MoveNext()) { T current = enumerator.Current; dictionary.Add(keySelector(current), current); } return dictionary; } public static Dictionary<TKey, TElement> ToDictionary<TKey, TElement, T>(this ImmutableArray<T> immutableArray, Func<T, TKey> keySelector, Func<T, TElement> elementSelector, IEqualityComparer<TKey>? comparer) where TKey : notnull { Requires.NotNull(keySelector, "keySelector"); Requires.NotNull(elementSelector, "elementSelector"); Dictionary<TKey, TElement> dictionary = new Dictionary<TKey, TElement>(immutableArray.Length, comparer); T[] array = immutableArray.array; foreach (T arg in array) { dictionary.Add(keySelector(arg), elementSelector(arg)); } return dictionary; } public static T[] ToArray<T>(this ImmutableArray<T> immutableArray) { immutableArray.ThrowNullRefIfNotInitialized(); if (immutableArray.array.Length == 0) { return ImmutableArray<T>.Empty.array; } return (T[])immutableArray.array.Clone(); } public static T First<T>(this ImmutableArray<T>.Builder builder) { Requires.NotNull(builder, "builder"); if (!builder.Any()) { throw new InvalidOperationException(); } return builder[0]; } public static T? FirstOrDefault<T>(this ImmutableArray<T>.Builder builder) { Requires.NotNull(builder, "builder"); if (!builder.Any()) { return default(T); } return builder[0]; } public static T Last<T>(this ImmutableArray<T>.Builder builder) { Requires.NotNull(builder, "builder"); if (!builder.Any()) { throw new InvalidOperationException(); } return builder[builder.Count - 1]; } public static T? LastOrDefault<T>(this ImmutableArray<T>.Builder builder) { Requires.NotNull(builder, "builder"); if (!builder.Any()) { return default(T); } return builder[builder.Count - 1]; } public static bool Any<T>(this ImmutableArray<T>.Builder builder) { Requires.NotNull(builder, "builder"); return builder.Count > 0; } private static IEnumerable<TResult> SelectManyIterator<TSource, TCollection, TResult>(this ImmutableArray<TSource> immutableArray, Func<TSource, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector) { TSource[] array = immutableArray.array; foreach (TSource item in array) { foreach (TCollection item2 in collectionSelector(item)) { yield return resultSelector(item, item2); } } } } } namespace System.Collections.Immutable { internal static class AllocFreeConcurrentStack<T> { private const int MaxSize = 35; private static readonly Type s_typeOfT = typeof(T); private static Stack<RefAsValueType<T>> ThreadLocalStack { get { Dictionary<Type, object> dictionary = AllocFreeConcurrentStack.t_stacks ?? (AllocFreeConcurrentStack.t_stacks = new Dictionary<Type, object>()); if (!dictionary.TryGetValue(s_typeOfT, out var value)) { value = new Stack<RefAsValueType<T>>(35); dictionary.Add(s_typeOfT, value); } return (Stack<RefAsValueType<T>>)value; } } public static void TryAdd(T item) { Stack<RefAsValueType<T>> threadLocalStack = ThreadLocalStack; if (threadLocalStack.Count < 35) { threadLocalStack.Push(new RefAsValueType<T>(item)); } } public static bool TryTake([MaybeNullWhen(false)] out T item) { Stack<RefAsValueType<T>> threadLocalStack = ThreadLocalStack; if (threadLocalStack != null && threadLocalStack.Count > 0) { item = threadLocalStack.Pop().Value; return true; } item = default(T); return false; } } internal static class AllocFreeConcurrentStack { [ThreadStatic] internal static Dictionary<Type, object>? t_stacks; } internal sealed class DictionaryEnumerator<TKey, TValue> : IDictionaryEnumerator, IEnumerator where TKey : notnull { private readonly IEnumerator<KeyValuePair<TKey, TValue>> _inner; public DictionaryEntry Entry => new DictionaryEntry(_inner.Current.Key, _inner.Current.Value); public object Key => _inner.Current.Key; public object? Value => _inner.Current.Value; public object Current => Entry; internal DictionaryEnumerator(IEnumerator<KeyValuePair<TKey, TValue>> inner) { Requires.NotNull(inner, "inner"); _inner = inner; } public bool MoveNext() { return _inner.MoveNext(); } public void Reset() { _inner.Reset(); } } internal struct DisposableEnumeratorAdapter<T, TEnumerator> : IDisposable where TEnumerator : struct, IEnumerator<T> { private readonly IEnumerator<T> _enumeratorObject; private TEnumerator _enumeratorStruct; public T Current { get { if (_enumeratorObject == null) { return _enumeratorStruct.Current; } return _enumeratorObject.Current; } } internal DisposableEnumeratorAdapter(TEnumerator enumerator) { _enumeratorStruct = enumerator; _enumeratorObject = null; } internal DisposableEnumeratorAdapter(IEnumerator<T> enumerator) { _enumeratorStruct = default(TEnumerator); _enumeratorObject = enumerator; } public bool MoveNext() { if (_enumeratorObject == null) { return _enumeratorStruct.MoveNext(); } return _enumeratorObject.MoveNext(); } public void Dispose() { if (_enumeratorObject != null) { _enumeratorObject.Dispose(); } else { _enumeratorStruct.Dispose(); } } public DisposableEnumeratorAdapter<T, TEnumerator> GetEnumerator() { return this; } } internal interface IBinaryTree { int Height { get; } bool IsEmpty { get; } int Count { get; } IBinaryTree? Left { get; } IBinaryTree? Right { get; } } internal interface IBinaryTree<out T> : IBinaryTree { T Value { get; } new IBinaryTree<T>? Left { get; } new IBinaryTree<T>? Right { get; } } internal interface IImmutableArray { Array? Array { get; } } public interface IImmutableDictionary<TKey, TValue> : IReadOnlyDictionary<TKey, TValue>, IReadOnlyCollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable { IImmutableDictionary<TKey, TValue> Clear(); IImmutableDictionary<TKey, TValue> Add(TKey key, TValue value); IImmutableDictionary<TKey, TValue> AddRange(IEnumerable<KeyValuePair<TKey, TValue>> pairs); IImmutableDictionary<TKey, TValue> SetItem(TKey key, TValue value); IImmutableDictionary<TKey, TValue> SetItems(IEnumerable<KeyValuePair<TKey, TValue>> items); IImmutableDictionary<TKey, TValue> RemoveRange(IEnumerable<TKey> keys); IImmutableDictionary<TKey, TValue> Remove(TKey key); bool Contains(KeyValuePair<TKey, TValue> pair); bool TryGetKey(TKey equalKey, out TKey actualKey); } internal interface IImmutableDictionaryInternal<TKey, TValue> { bool ContainsValue(TValue value); } public interface IImmutableList<T> : IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable { IImmutableList<T> Clear(); int IndexOf(T item, int index, int count, IEqualityComparer<T>? equalityComparer); int LastIndexOf(T item, int index, int count, IEqualityComparer<T>? equalityComparer); IImmutableList<T> Add(T value); IImmutableList<T> AddRange(IEnumerable<T> items); IImmutableList<T> Insert(int index, T element); IImmutableList<T> InsertRange(int index, IEnumerable<T> items); IImmutableList<T> Remove(T value, IEqualityComparer<T>? equalityComparer); IImmutableList<T> RemoveAll(Predicate<T> match); IImmutableList<T> RemoveRange(IEnumerable<T> items, IEqualityComparer<T>? equalityComparer); IImmutableList<T> RemoveRange(int index, int count); IImmutableList<T> RemoveAt(int index); IImmutableList<T> SetItem(int index, T value); IImmutableList<T> Replace(T oldValue, T newValue, IEqualityComparer<T>? equalityComparer); } internal interface IImmutableListQueries<T> : IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable { ImmutableList<TOutput> ConvertAll<TOutput>(Func<T, TOutput> converter); void ForEach(Action<T> action); ImmutableList<T> GetRange(int index, int count); void CopyTo(T[] array); void CopyTo(T[] array, int arrayIndex); void CopyTo(int index, T[] array, int arrayIndex, int count); bool Exists(Predicate<T> match); T? Find(Predicate<T> match); ImmutableList<T> FindAll(Predicate<T> match); int FindIndex(Predicate<T> match); int FindIndex(int startIndex, Predicate<T> match); int FindIndex(int startIndex, int count, Predicate<T> match); T? FindLast(Predicate<T> match); int FindLastIndex(Predicate<T> match); int FindLastIndex(int startIndex, Predicate<T> match); int FindLastIndex(int startIndex, int count, Predicate<T> match); bool TrueForAll(Predicate<T> match); int BinarySearch(T item); int BinarySearch(T item, IComparer<T>? comparer); int BinarySearch(int index, int count, T item, IComparer<T>? comparer); } public interface IImmutableQueue<T> : IEnumerable<T>, IEnumerable { bool IsEmpty { get; } IImmutableQueue<T> Clear(); T Peek(); IImmutableQueue<T> Enqueue(T value); IImmutableQueue<T> Dequeue(); } public interface IImmutableSet<T> : IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable { IImmutableSet<T> Clear(); bool Contains(T value); IImmutableSet<T> Add(T value); IImmutableSet<T> Remove(T value); bool TryGetValue(T equalValue, out T actualValue); IImmutableSet<T> Intersect(IEnumerable<T> other); IImmutableSet<T> Except(IEnumerable<T> other); IImmutableSet<T> SymmetricExcept(IEnumerable<T> other); IImmutableSet<T> Union(IEnumerable<T> other); bool SetEquals(IEnumerable<T> other); bool IsProperSubsetOf(IEnumerable<T> other); bool IsProperSupersetOf(IEnumerable<T> other); bool IsSubsetOf(IEnumerable<T> other); bool IsSupersetOf(IEnumerable<T> other); bool Overlaps(IEnumerable<T> other); } public interface IImmutableStack<T> : IEnumerable<T>, IEnumerable { bool IsEmpty { get; } IImmutableStack<T> Clear(); IImmutableStack<T> Push(T value); IImmutableStack<T> Pop(); T Peek(); } [DebuggerDisplay("Count = {Count}")] [DebuggerTypeProxy(typeof(ImmutableEnumerableDebuggerProxy<>))] public sealed class ImmutableHashSet<T> : IImmutableSet<T>, IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable, IHashKeyCollection<T>, ICollection<T>, ISet<T>, ICollection, IStrongEnumerable<T, ImmutableHashSet<T>.Enumerator> { private sealed class HashBucketByValueEqualityComparer : IEqualityComparer<HashBucket> { private static readonly IEqualityComparer<HashBucket> s_defaultInstance = new HashBucketByValueEqualityComparer(EqualityComparer<T>.Default); private readonly IEqualityComparer<T> _valueComparer; internal static IEqualityComparer<HashBucket> DefaultInstance => s_defaultInstance; internal HashBucketByValueEqualityComparer(IEqualityComparer<T> valueComparer) { Requires.NotNull(valueComparer, "valueComparer"); _valueComparer = valueComparer; } public bool Equals(HashBucket x, HashBucket y) { return x.EqualsByValue(y, _valueComparer); } public int GetHashCode(HashBucket obj) { throw new NotSupportedException(); } } private sealed class HashBucketByRefEqualityComparer : IEqualityComparer<HashBucket> { private static readonly IEqualityComparer<HashBucket> s_defaultInstance = new HashBucketByRefEqualityComparer(); internal static IEqualityComparer<HashBucket> DefaultInstance => s_defaultInstance; private HashBucketByRefEqualityComparer() { } public bool Equals(HashBucket x, HashBucket y) { return x.EqualsByRef(y); } public int GetHashCode(HashBucket obj) { throw new NotSupportedException(); } } [DebuggerDisplay("Count = {Count}")] public sealed class Builder : IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable, ISet<T>, ICollection<T> { private SortedInt32KeyNode<HashBucket> _root = SortedInt32KeyNode<HashBucket>.EmptyNode; private IEqualityComparer<T> _equalityComparer; private readonly IEqualityComparer<HashBucket> _hashBucketEqualityComparer; private int _count; private ImmutableHashSet<T> _immutable; private int _version; public int Count => _count; bool ICollection<T>.IsReadOnly => false; public IEqualityComparer<T> KeyComparer { get { return _equalityComparer; } set { Requires.NotNull(value, "value"); if (value != _equalityComparer) { MutationResult mutationResult = ImmutableHashSet<T>.Union((IEnumerable<T>)this, new MutationInput(SortedInt32KeyNode<HashBucket>.EmptyNode, value, _hashBucketEqualityComparer, 0)); _immutable = null; _equalityComparer = value; Root = mutationResult.Root; _count = mutationResult.Count; } } } internal int Version => _version; private MutationInput Origin => new MutationInput(Root, _equalityComparer, _hashBucketEqualityComparer, _count); private SortedInt32KeyNode<HashBucket> Root { get { return _root; } set { _version++; if (_root != value) { _root = value; _immutable = null; } } } internal Builder(ImmutableHashSet<T> set) { Requires.NotNull(set, "set"); _root = set._root; _count = set._count; _equalityComparer = set._equalityComparer; _hashBucketEqualityComparer = set._hashBucketEqualityComparer; _immutable = set; } public Enumerator GetEnumerator() { return new Enumerator(_root, this); } public ImmutableHashSet<T> ToImmutable() { return _immutable ?? (_immutable = ImmutableHashSet<T>.Wrap(_root, _equalityComparer, _count)); } public bool TryGetValue(T equalValue, out T actualValue) { int key = ((equalValue != null) ? _equalityComparer.GetHashCode(equalValue) : 0); if (_root.TryGetValue(key, out var value)) { return value.TryExchange(equalValue, _equalityComparer, out actualValue); } actualValue = equalValue; return false; } public bool Add(T item) { MutationResult result = ImmutableHashSet<T>.Add(item, Origin); Apply(result); return result.Count != 0; } public bool Remove(T item) { MutationResult result = ImmutableHashSet<T>.Remove(item, Origin); Apply(result); return result.Count != 0; } public bool Contains(T item) { return ImmutableHashSet<T>.Contains(item, Origin); } public void Clear() { _count = 0; Root = SortedInt32KeyNode<HashBucket>.EmptyNode; } public void ExceptWith(IEnumerable<T> other) { MutationResult result = ImmutableHashSet<T>.Except(other, _equalityComparer, _hashBucketEqualityComparer, _root); Apply(result); } public void IntersectWith(IEnumerable<T> other) { MutationResult result = ImmutableHashSet<T>.Intersect(other, Origin); Apply(result); } public bool IsProperSubsetOf(IEnumerable<T> other) { return ImmutableHashSet<T>.IsProperSubsetOf(other, Origin); } public bool IsProperSupersetOf(IEnumerable<T> other) { return ImmutableHashSet<T>.IsProperSupersetOf(other, Origin); } public bool IsSubsetOf(IEnumerable<T> other) { return ImmutableHashSet<T>.IsSubsetOf(other, Origin); } public bool IsSupersetOf(IEnumerable<T> other) { return ImmutableHashSet<T>.IsSupersetOf(other, Origin); } public bool Overlaps(IEnumerable<T> other) { return ImmutableHashSet<T>.Overlaps(other, Origin); } public bool SetEquals(IEnumerable<T> other) { if (this == other) { return true; } return ImmutableHashSet<T>.SetEquals(other, Origin); } public void SymmetricExceptWith(IEnumerable<T> other) { MutationResult result = ImmutableHashSet<T>.SymmetricExcept(other, Origin); Apply(result); } public void UnionWith(IEnumerable<T> other) { MutationResult result = ImmutableHashSet<T>.Union(other, Origin); Apply(result); } void ICollection<T>.Add(T item) { Add(item); } void ICollection<T>.CopyTo(T[] array, int arrayIndex) { Requires.NotNull(array, "array"); Requires.Range(arrayIndex >= 0, "arrayIndex"); Requires.Range(array.Length >= arrayIndex + Count, "arrayIndex"); using Enumerator enumerator = GetEnumerator(); while (enumerator.MoveNext()) { T current = enumerator.Current; array[arrayIndex++] = current; } } IEnumerator<T> IEnumerable<T>.GetEnumerator() { return GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } private void Apply(MutationResult result) { Root = result.Root; if (result.CountType == CountType.Adjustment) { _count += result.Count; } else { _count = result.Count; } } } public struct Enumerator : IEnumerator<T>, IDisposable, IEnumerator, IStrongEnumerator<T> { private readonly Builder _builder; private SortedInt32KeyNode<HashBucket>.Enumerator _mapEnumerator; private HashBucket.Enumerator _bucketEnumerator; private int _enumeratingBuilderVersion; public T Current { get { _mapEnumerator.ThrowIfDisposed(); return _bucketEnumerator.Current; } } object? IEnumerator.Current => Current; internal Enumerator(SortedInt32KeyNode<HashBucket> root, Builder? builder = null) { _builder = builder; _mapEnumerator = new SortedInt32KeyNode<HashBucket>.Enumerator(root); _bucketEnumerator = default(HashBucket.Enumerator); _enumeratingBuilderVersion = builder?.Version ?? (-1); } public bool MoveNext() { ThrowIfChanged(); if (_bucketEnumerator.MoveNext()) { return true; } if (_mapEnumerator.MoveNext()) { _bucketEnumerator = new HashBucket.Enumerator(_mapEnumerator.Current.Value); return _bucketEnumerator.MoveNext(); } return false; } public void Reset() { _enumeratingBuilderVersion = ((_builder != null) ? _builder.Version : (-1)); _mapEnumerator.Reset(); _bucketEnumerator.Dispose(); _bucketEnumerator = default(HashBucket.Enumerator); } public void Dispose() { _mapEnumerator.Dispose(); _bucketEnumerator.Dispose(); } private void ThrowIfChanged() { if (_builder != null && _builder.Version != _enumeratingBuilderVersion) { throw new InvalidOperationException(System.SR.CollectionModifiedDuringEnumeration); } } } internal enum OperationResult { SizeChanged, NoChangeRequired } internal readonly struct HashBucket { internal struct Enumerator : IEnumerator<T>, IDisposable, IEnumerator { private enum Position { BeforeFirst, First, Additional, End } private readonly HashBucket _bucket; private bool _disposed; private Position _currentPosition; private ImmutableList<T>.Enumerator _additionalEnumerator; object? IEnumerator.Current => Current; public T Current { get { ThrowIfDisposed(); return _currentPosition switch { Position.First => _bucket._firstValue, Position.Additional => _additionalEnumerator.Current, _ => throw new InvalidOperationException(), }; } } internal Enumerator(HashBucket bucket) { _disposed = false; _bucket = bucket; _currentPosition = Position.BeforeFirst; _additionalEnumerator = default(ImmutableList<T>.Enumerator); } public bool MoveNext() { ThrowIfDisposed(); if (_bucket.IsEmpty) { _currentPosition = Position.End; return false; } switch (_currentPosition) { case Position.BeforeFirst: _currentPosition = Position.First; return true; case Position.First: if (_bucket._additionalElements.IsEmpty) { _currentPosition = Position.End; return false; } _currentPosition = Position.Additional; _additionalEnumerator = new ImmutableList<T>.Enumerator(_bucket._additionalElements); return _additionalEnumerator.MoveNext(); case Position.Additional: return _additionalEnumerator.MoveNext(); case Position.End: return false; default: throw new InvalidOperationException(); } } public void Reset() { ThrowIfDisposed(); _additionalEnumerator.Dispose(); _currentPosition = Position.BeforeFirst; } public void Dispose() { _disposed = true; _additionalEnumerator.Dispose(); } private void ThrowIfDisposed() { if (_disposed) { Requires.FailObjectDisposed(this); } } } private readonly T _firstValue; private readonly ImmutableList<T>.Node _additionalElements; internal bool IsEmpty => _additionalElements == null; private HashBucket(T firstElement, ImmutableList<T>.Node additionalElements = null) { _firstValue = firstElement; _additionalElements = additionalElements ?? ImmutableList<T>.Node.EmptyNode; } public Enumerator GetEnumerator() { return new Enumerator(this); } public override bool Equals(object? obj) { throw new NotSupportedException(); } public override int GetHashCode() { throw new NotSupportedException(); } internal bool EqualsByRef(HashBucket other) { if ((object)_firstValue == (object)other._firstValue) { return _additionalElements == other._additionalElements; } return false; } internal bool EqualsByValue(HashBucket other, IEqualityComparer<T> valueComparer) { if (valueComparer.Equals(_firstValue, other._firstValue)) { return _additionalElements == other._additionalElements; } return false; } internal HashBucket Add(T value, IEqualityComparer<T> valueComparer, out OperationResult result) { if (IsEmpty) { result = OperationResult.SizeChanged; return new HashBucket(value); } if (valueComparer.Equals(value, _firstValue) || _additionalElements.IndexOf(value, valueComparer) >= 0) { result = OperationResult.NoChangeRequired; return this; } result = OperationResult.SizeChanged; return new HashBucket(_firstValue, _additionalElements.Add(value)); } internal bool Contains(T value, IEqualityComparer<T> valueComparer) { if (IsEmpty) { return false; } if (!valueComparer.Equals(value, _firstValue)) { return _additionalElements.IndexOf(value, valueComparer) >= 0; } return true; } internal bool TryExchange(T value, IEqualityComparer<T> valueComparer, out T existingValue) { if (!IsEmpty) { if (valueComparer.Equals(value, _firstValue)) { existingValue = _firstValue; return true; } int num = _additionalElements.IndexOf(value, valueComparer); if (num >= 0) { existingValue = _additionalElements.ItemRef(num); return true; } } existingValue = value; return false; } internal HashBucket Remove(T value, IEqualityComparer<T> equalityComparer, out OperationResult result) { if (IsEmpty) { result = OperationResult.NoChangeRequired; return this; } if (equalityComparer.Equals(_firstValue, value)) { if (_additionalElements.IsEmpty) { result = OperationResult.SizeChanged; return default(HashBucket); } int count = _additionalElements.Left.Count; result = OperationResult.SizeChanged; return new HashBucket(_additionalElements.Key, _additionalElements.RemoveAt(count)); } int num = _additionalElements.IndexOf(value, equalityComparer); if (num < 0) { result = OperationResult.NoChangeRequired; return this; } result = OperationResult.SizeChanged; return new HashBucket(_firstValue, _additionalElements.RemoveAt(num)); } internal void Freeze() { _additionalElements?.Freeze(); } } private readonly struct MutationInput { private readonly SortedInt32KeyNode<HashBucket> _root; private readonly IEqualityComparer<T> _equalityComparer; private readonly int _count; private readonly IEqualityComparer<HashBucket> _hashBucketEqualityComparer; internal SortedInt32KeyNode<HashBucket> Root => _root; internal IEqualityComparer<T> EqualityComparer => _equalityComparer; internal int Count => _count; internal IEqualityComparer<HashBucket> HashBucketEqualityComparer => _hashBucketEqualityComparer; internal MutationInput(ImmutableHashSet<T> set) { Requires.NotNull(set, "set"); _root = set._root; _equalityComparer = set._equalityComparer; _count = set._count; _hashBucketEqualityComparer = set._hashBucketEqualityComparer; } internal MutationInput(SortedInt32KeyNode<HashBucket> root, IEqualityComparer<T> equalityComparer, IEqualityComparer<HashBucket> hashBucketEqualityComparer, int count) { Requires.NotNull(root, "root"); Requires.NotNull(equalityComparer, "equalityComparer"); Requires.Range(count >= 0, "count"); Requires.NotNull(hashBucketEqualityComparer, "hashBucketEqualityComparer"); _root = root; _equalityComparer = equalityComparer; _count = count; _hashBucketEqualityComparer = hashBucketEqualityComparer; } } private enum CountType { Adjustment, FinalValue } private readonly struct MutationResult { private readonly SortedInt32KeyNode<HashBucket> _root; private readonly int _count; private readonly CountType _countType; internal SortedInt32KeyNode<HashBucket> Root => _root; internal int Count => _count; internal CountType CountType => _countType; internal MutationResult(SortedInt32KeyNode<HashBucket> root, int count, CountType countType = CountType.Adjustment) { Requires.NotNull(root, "root"); _root = root; _count = count; _countType = countType; } internal ImmutableHashSet<T> Finalize(ImmutableHashSet<T> priorSet) { Requires.NotNull(priorSet, "priorSet"); int num = Count; if (CountType == CountType.Adjustment) { num += priorSet._count; } return priorSet.Wrap(Root, num); } } private readonly struct NodeEnumerable : IEnumerable<T>, IEnumerable { private readonly SortedInt32KeyNode<HashBucket> _root; internal NodeEnumerable(SortedInt32KeyNode<HashBucket> root) { Requires.NotNull(root, "root"); _root = root; } public Enumerator GetEnumerator() { return new Enumerator(_root); } [ExcludeFromCodeCoverage] IEnumerator<T> IEnumerable<T>.GetEnumerator() { return GetEnumerator(); } [ExcludeFromCodeCoverage] IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } public static readonly ImmutableHashSet<T> Empty = new ImmutableHashSet<T>(SortedInt32KeyNode<HashBucket>.EmptyNode, EqualityComparer<T>.Default, 0); private static readonly Action<KeyValuePair<int, HashBucket>> s_FreezeBucketAction = delegate(KeyValuePair<int, HashBucket> kv) { kv.Value.Freeze(); }; private readonly IEqualityComparer<T> _equalityComparer; private readonly int _count; private readonly SortedInt32KeyNode<HashBucket> _root; private readonly IEqualityComparer<HashBucket> _hashBucketEqualityComparer; public int Count => _count; public bool IsEmpty => Count == 0; public IEqualityComparer<T> KeyComparer => _equalityComparer; [DebuggerBrowsable(DebuggerBrowsableState.Never)] object ICollection.SyncRoot => this; [DebuggerBrowsable(DebuggerBrowsableState.Never)] bool ICollection.IsSynchronized => true; internal IBinaryTree Root => _root; private MutationInput Origin => new MutationInput(this); bool ICollection<T>.IsReadOnly => true; internal ImmutableHashSet(IEqualityComparer<T> equalityComparer) : this(SortedInt32KeyNode<HashBucket>.EmptyNode, equalityComparer, 0) { } private ImmutableHashSet(SortedInt32KeyNode<HashBucket> root, IEqualityComparer<T> equalityComparer, int count) { Requires.NotNull(root, "root"); Requires.NotNull(equalityComparer, "equalityComparer"); root.Freeze(s_FreezeBucketAction); _root = root; _count = count; _equalityComparer = equalityComparer; _hashBucketEqualityComparer = GetHashBucketEqualityComparer(equalityComparer); } public ImmutableHashSet<T> Clear() { if (!IsEmpty) { return Empty.WithComparer(_equalityComparer); } return this; } IImmutableSet<T> IImmutableSet<T>.Clear() { return Clear(); } public Builder ToBuilder() { return new Builder(this); } public ImmutableHashSet<T> Add(T item) { return Add(item, Origin).Finalize(this); } public ImmutableHashSet<T> Remove(T item) { return Remove(item, Origin).Finalize(this); } public bool TryGetValue(T equalValue, out T actualValue) { int key = ((equalValue != null) ? _equalityComparer.GetHashCode(equalValue) : 0); if (_root.TryGetValue(key, out var value)) { return value.TryExchange(equalValue, _equalityComparer, out actualValue); } actualValue = equalValue; return false; } public ImmutableHashSet<T> Union(IEnumerable<T> other) { Requires.NotNull(other, "other"); return Union(other, avoidWithComparer: false); } public ImmutableHashSet<T> Intersect(IEnumerable<T> other) { Requires.NotNull(other, "other"); return Intersect(other, Origin).Finalize(this); } public ImmutableHashSet<T> Except(IEnumerable<T> other) { Requires.NotNull(other, "other"); return Except(other, _equalityComparer, _hashBucketEqualityComparer, _root).Finalize(this); } public ImmutableHashSet<T> SymmetricExcept(IEnumerable<T> other) { Requires.NotNull(other, "other"); return SymmetricExcept(other, Origin).Finalize(this); } public bool SetEquals(IEnumerable<T> other) { Requires.NotNull(other, "other"); if (this == other) { return true; } return SetEquals(other, Origin); } public bool IsProperSubsetOf(IEnumerable<T> other) { Requires.NotNull(other, "other"); return IsProperSubsetOf(other, Origin); } public bool IsProperSupersetOf(IEnumerable<T> other) { Requires.NotNull(other, "other"); return IsProperSupersetOf(other, Origin); } public bool IsSubsetOf(IEnumerable<T> other) { Requires.NotNull(other, "other"); return IsSubsetOf(other, Origin); } public bool IsSupersetOf(IEnumerable<T> other) { Requires.NotNull(other, "other"); return IsSupersetOf(other, Origin); } public bool Overlaps(IEnumerable<T> other) { Requires.NotNull(other, "other"); return Overlaps(other, Origin); } IImmutableSet<T> IImmutableSet<T>.Add(T item) { return Add(item); } IImmutableSet<T> IImmutableSet<T>.Remove(T item) { return Remove(item); } IImmutableSet<T> IImmutableSet<T>.Union(IEnumerable<T> other) { return Union(other); } IImmutableSet<T> IImmutableSet<T>.Intersect(IEnumerable<T> other) { return Intersect(other); } IImmutableSet<T> IImmutableSet<T>.Except(IEnumerable<T> other) { return Except(other); } IImmutableSet<T> IImmutableSet<T>.SymmetricExcept(IEnumerable<T> other) { return SymmetricExcept(other); } public bool Contains(T item) { return Contains(item, Origin); } public ImmutableHashSet<T> WithComparer(IEqualityComparer<T>? equalityComparer) { if (equalityComparer == null) { equalityComparer = EqualityComparer<T>.Default; } if (equalityComparer == _equalityComparer) { return this; } ImmutableHashSet<T> immutableHashSet = new ImmutableHashSet<T>(equalityComparer); return immutableHashSet.Union(this, avoidWithComparer: true); } bool ISet<T>.Add(T item) { throw new NotSupportedException(); } void ISet<T>.ExceptWith(IEnumerable<T> other) { throw new NotSupportedException(); } void ISet<T>.IntersectWith(IEnumerable<T> other) { throw new NotSupportedException(); } void ISet<T>.SymmetricExceptWith(IEnumerable<T> other) { throw new NotSupportedException(); } void ISet<T>.UnionWith(IEnumerable<T> other) { throw new NotSupportedException(); } void ICollection<T>.CopyTo(T[] array, int arrayIndex) { Requires.NotNull(array, "array"); Requires.Range(arrayIndex >= 0, "arrayIndex"); Requires.Range(array.Length >= arrayIndex + Count, "arrayIndex"); using Enumerator enumerator = GetEnumerator(); while (enumerator.MoveNext()) { T current = enumerator.Current; array[arrayIndex++] = current; } } void ICollection<T>.Add(T item) { throw new NotSupportedException(); } void ICollection<T>.Clear() { throw new NotSupportedException(); } bool ICollection<T>.Remove(T item) { throw new NotSupportedException(); } void ICollection.CopyTo(Array array, int arrayIndex) { Requires.NotNull(array, "array"); Requires.Range(arrayIndex >= 0, "arrayIndex"); Requires.Range(array.Length >= arrayIndex + Count, "arrayIndex"); using Enumerator enumerator = GetEnumerator(); while (enumerator.MoveNext()) { T current = enumerator.Current; array.SetValue(current, arrayIndex++); } } public Enumerator GetEnumerator() { return new Enumerator(_root); } IEnumerator<T> IEnumerable<T>.GetEnumerator() { if (!IsEmpty) { return GetEnumerator(); } return Enumerable.Empty<T>().GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } private static bool IsSupersetOf(IEnumerable<T> other, MutationInput origin) { Requires.NotNull(other, "other"); foreach (T item in other.GetEnumerableDisposable<T, Enumerator>()) { if (!Contains(item, origin)) { return false; } } return true; } private static MutationResult Add(T item, MutationInput origin) { int num = ((item != null) ? origin.EqualityComparer.GetHashCode(item) : 0); OperationResult result; HashBucket newBucket = origin.Root.GetValueOrDefault(num).Add(item, origin.EqualityComparer, out result); if (result == OperationResult.NoChangeRequired) { return new MutationResult(origin.Root, 0); } SortedInt32KeyNode<HashBucket> root = UpdateRoot(origin.Root, num, origin.HashBucketEqualityComparer, newBucket); return new MutationResult(root, 1); } private static MutationResult Remove(T item, MutationInput origin) { OperationResult result = OperationResult.NoChangeRequired; int num = ((item != null) ? origin.EqualityComparer.GetHashCode(item) : 0); SortedInt32KeyNode<HashBucket> root = origin.Root; if (origin.Root.TryGetValue(num, out var value)) { HashBucket newBucket = value.Remove(item, origin.EqualityComparer, out result); if (result == OperationResult.NoChangeRequired) { return new MutationResult(origin.Root, 0); } root = UpdateRoot(origin.Root, num, origin.HashBucketEqualityComparer, newBucket); } return new MutationResult(root, (result == OperationResult.SizeChanged) ? (-1) : 0); } private static bool Contains(T item, MutationInput origin) { int key = ((item != null) ? origin.EqualityComparer.GetHashCode(item) : 0); if (origin.Root.TryGetValue(key, out var value)) { return value.Contains(item, origin.EqualityComparer); } return false; } private static MutationResult Union(IEnumerable<T> other, MutationInput origin) { Requires.NotNull(other, "other"); int num = 0; SortedInt32KeyNode<HashBucket> sortedInt32KeyNode = origin.Root; foreach (T item in other.GetEnumerableDisposable<T, Enumerator>()) { int num2 = ((item != null) ? origin.EqualityComparer.GetHashCode(item) : 0); OperationResult result; HashBucket newBucket = sortedInt32KeyNode.GetValueOrDefault(num2).Add(item, origin.EqualityComparer, out result); if (result == OperationResult.SizeChanged) { sortedInt32KeyNode = UpdateRoot(sortedInt32KeyNode, num2, origin.HashBucketEqualityComparer, newBucket); num++; } } return new MutationResult(sortedInt32KeyNode, num); } private static bool Overlaps(IEnumerable<T> other, MutationInput origin) { Requires.NotNull(other, "other"); if (origin.Root.IsEmpty) { return false; } foreach (T item in other.GetEnumerableDisposable<T, Enumerator>()) { if (Contains(item, origin)) { return true; } } return false; } private static bool SetEquals(IEnumerable<T> other, MutationInput origin) { Requires.NotNull(other, "other"); HashSet<T> hashSet = new HashSet<T>(other, origin.EqualityComparer); if (origin.Count != hashSet.Count) { return false; } foreach (T item in hashSet) { if (!Contains(item, origin)) { return false; } } return true; } private static SortedInt32KeyNode<HashBucket> UpdateRoot(SortedInt32KeyNode<HashBucket> root, int hashCode, IEqualityComparer<HashBucket> hashBucketEqualityComparer, HashBucket newBucket) { bool mutated; if (newBucket.IsEmpty) { return root.Remove(hashCode, out mutated); } bool mutated2; return root.SetItem(hashCode, newBucket, hashBucketEqualityComparer, out mutated, out mutated2); } private static MutationResult Intersect(IEnumerable<T> other, MutationInput origin) { Requires.NotNull(other, "other"); SortedInt32KeyNode<HashBucket> root = SortedInt32KeyNode<HashBucket>.EmptyNode; int num = 0; foreach (T item in other.GetEnumerableDisposable<T, Enumerator>()) { if (Contains(item, origin)) { MutationResult mutationResult = Add(item, new MutationInput(root, origin.EqualityComparer, origin.HashBucketEqualityComparer, num)); root = mutationResult.Root; num += mutationResult.Count; } } return new MutationResult(root, num, CountType.FinalValue); } private static MutationResult Except(IEnumerable<T> other, IEqualityComparer<T> equalityComparer, IEqualityComparer<HashBucket> hashBucketEqualityComparer, SortedInt32KeyNode<HashBucket> root) { Requires.NotNull(other, "other"); Requires.NotNull(equalityComparer, "equalityComparer"); Requires.NotNull(root, "root"); int num = 0; SortedInt32KeyNode<HashBucket> sortedInt32KeyNode = root; foreach (T item in other.GetEnumerableDisposable<T, Enumerator>()) { int num2 = ((item != null) ? equalityComparer.GetHashCode(item) : 0); if (sortedInt32KeyNode.TryGetValue(num2, out var value)) { OperationResult result; HashBucket newBucket = value.Remove(item, equalityComparer, out result); if (result == OperationResult.SizeChanged) { num--; sortedInt32KeyNode = UpdateRoot(sortedInt32KeyNode, num2, hashBucketEqualityComparer, newBucket); } } } return new MutationResult(sortedInt32KeyNode, num); } private static MutationResult SymmetricExcept(IEnumerable<T> other, MutationInput origin) { Requires.NotNull(other, "other"); ImmutableHashSet<T> immutableHashSet = ImmutableHashSet.CreateRange(origin.EqualityComparer, other); int num = 0; SortedInt32KeyNode<HashBucket> root = SortedInt32KeyNode<HashBucket>.EmptyNode; foreach (T item in new NodeEnumerable(origin.Root)) { if (!immutableHashSet.Contains(item)) { MutationResult mutationResult = Add(item, new MutationInput(root, origin.EqualityComparer, origin.HashBucketEqualityComparer, num)); root = mutationResult.Root; num += mutationResult.Count; } } foreach (T item2 in immutableHashSet) { if (!Contains(item2, origin)) { MutationResult mutationResult2 = Add(item2, new MutationInput(root, origin.EqualityComparer, origin.HashBucketEqualityComparer, num)); root = mutationResult2.Root; num += mutationResult2.Count; } } return new MutationResult(root, num, CountType.FinalValue); } private static bool IsProperSubsetOf(IEnumerable<T> other, MutationInput origin) { Requires.NotNull(other, "other"); if (origin.Root.IsEmpty) { return other.Any(); } HashSet<T> hashSet = new HashSet<T>(other, origin.EqualityComparer); if (origin.Count >= hashSet.Count) { return false; } int num = 0; bool flag = false; foreach (T item in hashSet) { if (Contains(item, origin)) { num++; } else { flag = true; } if (num == origin.Count && flag) { return true; } } return false; } private static bool IsProperSupersetOf(IEnumerable<T> other, MutationInput origin) { Requires.NotNull(other, "other"); if (origin.Root.IsEmpty) { return false; } int num = 0; foreach (T item in other.GetEnumerableDisposable<T, Enumerator>()) { num++; if (!Contains(item, origin)) { return false; } } return origin.Count > num; } private static bool IsSubsetOf(IEnumerable<T> other, MutationInput origin) { Requires.NotNull(other, "other"); if (origin.Root.IsEmpty) { return true; } HashSet<T> hashSet = new HashSet<T>(other, origin.EqualityComparer); int num = 0; foreach (T item in hashSet) { if (Contains(item, origin)) { num++; } } return num == origin.Count; } private static ImmutableHashSet<T> Wrap(SortedInt32KeyNode<HashBucket> root, IEqualityComparer<T> equalityComparer, int count) { Requires.NotNull(root, "root"); Requires.NotNull(equalityComparer, "equalityComparer"); Requires.Range(count >= 0, "count"); return new ImmutableHashSet<T>(root, equalityComparer, count); } private static IEqualityComparer<HashBucket> GetHashBucketEqualityComparer(IEqualityComparer<T> valueComparer) { if (!ImmutableExtensions.IsValueType<T>()) { return HashBucketByRefEqualityComparer.DefaultInstance; } if (valueComparer == EqualityComparer<T>.Default) { return HashBucketByValueEqualityComparer.DefaultInstance; } return new HashBucketByValueEqualityComparer(valueComparer); } private ImmutableHashSet<T> Wrap(SortedInt32KeyNode<HashBucket> root, int adjustedCountIfDifferentRoot) { if (root == _root) { return this; } return new ImmutableHashSet<T>(root, _equalityComparer, adjustedCountIfDifferentRoot); } private ImmutableHashSet<T> Union(IEnumerable<T> items, bool avoidWithComparer) { Requires.NotNull(items, "items"); if (IsEmpty && !avoidWithComparer && items is ImmutableHashSet<T> immutableHashSet) { return immutableHashSet.WithComparer(KeyComparer); } return Union(items, Origin).Finalize(this); } } internal interface IStrongEnumerable<out T, TEnumerator> where TEnumerator : struct, IStrongEnumerator<T> { TEnumerator GetEnumerator(); } internal interface IStrongEnumerator<T> { T Current { get; } bool MoveNext(); } internal interface IOrderedCollection<out T> : IEnumerable<T>, IEnumerable { int Count { get; } T this[int index] { get; } } public static class ImmutableArray { internal static readonly byte[] TwoElementArray = new byte[2]; public static ImmutableArray<T> Create<T>() { return ImmutableArray<T>.Empty; } public static ImmutableArray<T> Create<T>(T item) { T[] items = new T[1] { item }; return new ImmutableArray<T>(items); } public static ImmutableArray<T> Create<T>(T item1, T item2) { T[] items = new T[2] { item1, item2 }; return new ImmutableArray<T>(items); } public static ImmutableArray<T> Create<T>(T item1, T item2, T item3) { T[] items = new T[3] { item1, item2, item3 }; return new ImmutableArray<T>(items); } public static ImmutableArray<T> Create<T>(T item1, T item2, T item3, T item4) { T[] items = new T[4] { item1, item2, item3, item4 }; return new ImmutableArray<T>(items); } public static ImmutableArray<T> Create<T>(ReadOnlySpan<T> items) { if (items.IsEmpty) { return ImmutableArray<T>.Empty; } T[] items2 = items.ToArray(); return new ImmutableArray<T>(items2); } public static ImmutableArray<T> Create<T>(Span<T> items) { return Create((ReadOnlySpan<T>)items); } public static ImmutableArray<T> ToImmutableArray<T>(this ReadOnlySpan<T> items) { return Create(items); } public static ImmutableArray<T> ToImmutableArray<T>(this Span<T> items) { return Create((ReadOnlySpan<T>)items); } public static ImmutableArray<T> CreateRange<T>(IEnumerable<T> items) { Requires.NotNull(items, "items"); if (items is IImmutableArray immutableArray) { Array array = immutableArray.Array; if (array == null) { throw new InvalidOperationException(System.SR.InvalidOperationOnDefaultArray); } return new ImmutableArray<T>((T[])array); } if (items.TryGetCount(out var count)) { return new ImmutableArray<T>(items.ToArray(count)); } return new ImmutableArray<T>(items.ToArray()); } public static ImmutableArray<T> Create<T>(params T[]? items) { if (items == null || items.Length == 0) { return ImmutableArray<T>.Empty; } T[] array = new T[items.Length]; Array.Copy(items, array, items.Length); return new ImmutableArray<T>(array); } public static ImmutableArray<T> Create<T>(T[] items, int start, int length) { Requires.NotNull(items, "items"); Requires.Range(start >= 0 && start <= items.Length, "start"); Requires.Range(length >= 0 && start + length <= items.Length, "length"); if (length == 0) { return Create<T>(); } T[] array = new T[length]; for (int i = 0; i < array.Length; i++) { array[i] = items[start + i]; } return new ImmutableArray<T>(array); } public static ImmutableArray<T> Create<T>(ImmutableArray<T> items, int start, int length) { Requires.Range(start >= 0 && start <= items.Length, "start"); Requires.Range(length >= 0 && start + length <= items.Length, "length"); if (length == 0) { return Create<T>(); } if (start == 0 && length == items.Length) { return items; } T[] array = new T[length]; Array.Copy(items.array, start, array, 0, length); return new ImmutableArray<T>(array); } public static ImmutableArray<TResult> CreateRange<TSource, TResult>(ImmutableArray<TSource> items, Func<TSource, TResult> selector) { Requires.NotNull(selector, "selector"); int length = items.Length; if (length == 0) { return Create<TResult>(); } TResult[] array = new TResult[length]; for (int i = 0; i < array.Length; i++) { array[i] = selector(items[i]); } return new ImmutableArray<TResult>(array); } public static ImmutableArray<TResult> CreateRange<TSource, TResult>(ImmutableArray<TSource> items, int start, int length, Func<TSource, TResult> selector) { int length2 = items.Length; Requires.Range(start >= 0 && start <= length2, "start"); Requires.Range(length >= 0 && start + length <= length2, "length"); Requires.NotNull(selector, "selector"); if (length == 0) { return Create<TResult>(); } TResult[] array = new TResult[length]; for (int i = 0; i < array.Length; i++) { array[i] = selector(items[i + start]); } return new ImmutableArray<TResult>(array); } public static ImmutableArray<TResult> CreateRange<TSource, TArg, TResult>(ImmutableArray<TSource> items, Func<TSource, TArg, TResult> selector, TArg arg) { Requires.NotNull(selector, "selector"); int length = items.Length; if (length == 0) { return Create<TResult>(); } TResult[] array = new TResult[length]; for (int i = 0; i < array.Length; i++) { array[i] = selector(items[i], arg); } return new ImmutableArray<TResult>(array); } public static ImmutableArray<TResult> CreateRange<TSource, TArg, TResult>(ImmutableArray<TSource> items, int start, int length, Func<TSource, TArg, TResult> selector, TArg arg) { int length2 = items.Length; Requires.Range(start >= 0 && start <= length2, "start"); Requires.Range(length >= 0 && start + length <= length2, "length"); Requires.NotNull(selector, "selector"); if (length == 0) { return Create<TResult>(); } TResult[] array = new TResult[length]; for (int i = 0; i < array.Length; i++) { array[i] = selector(items[i + start], arg); } return new ImmutableArray<TResult>(array); } public static ImmutableArray<T>.Builder CreateBuilder<T>() { return Create<T>().ToBuilder(); } public static ImmutableArray<T>.Builder CreateBuilder<T>(int initialCapacity) { return new ImmutableArray<T>.Builder(initialCapacity); } public static ImmutableArray<TSource> ToImmutableArray<TSource>(this IEnumerable<TSource> items) { if (items is ImmutableArray<TSource>) { return (ImmutableArray<TSource>)(object)items; } return CreateRange(items); } public static ImmutableArray<TSource> ToImmutableArray<TSource>(this ImmutableArray<TSource>.Builder builder) { Requires.NotNull(builder, "builder"); return builder.ToImmutable(); } public static int BinarySearch<T>(this ImmutableArray<T> array, T value) { return Array.BinarySearch(array.array, value); } public static int BinarySearch<T>(this ImmutableArray<T> array, T value, IComparer<T>? comparer) { return Array.BinarySearch(array.array, value, comparer); } public static int BinarySearch<T>(this ImmutableArray<T> array, int index, int length, T value) { return Array.BinarySearch(array.array, index, length, value); } public static int BinarySearch<T>(this ImmutableArray<T> array, int index, int length, T value, IComparer<T>? comparer) { return Array.BinarySearch(array.array, index, length, value, comparer); } } [DebuggerDisplay("{DebuggerDisplay,nq}")] [System.Runtime.Versioning.NonVersionable] public readonly struct ImmutableArray<T> : IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable, IList<T>, ICollection<T>, IEquatable<ImmutableArray<T>>, IList, ICollection, IImmutableArray, IStructuralComparable, IStructuralEquatable, IImmutableList<T> { [DebuggerDisplay("Count = {Count}")] [DebuggerTypeProxy(typeof(ImmutableArrayBuilderDebuggerProxy<>))] public sealed class Builder : IList<T>, ICollection<T>, IEnumerable<T>, IEnumerable, IReadOnlyList<T>, IReadOnlyCollection<T> { private T[] _elements; private int _count; public int Capacity { get { return _elements.Length; } set { if (value < _count) { throw new ArgumentException(System.SR.CapacityMustBeGreaterThanOrEqualToCount, "value"); } if (value == _elements.Length) { return; } if (value > 0) { T[] array = new T[value]; if (_count > 0) { Array.Copy(_elements, array, _count); } _elements = array; } else { _elements = ImmutableArray<T>.Empty.array; } } } public int Count { get { return _count; } set { Requires.Range(value >= 0, "value"); if (value < _count) { if (_count - value > 64) { Array.Clear(_elements, value, _count - value); } else { for (int i = value; i < Count; i++) { _elements[i] = default(T); } } } else if (value > _count) { EnsureCapacity(value); } _count = value; } } public T this[int index] { get { if (index >= Count) { ThrowIndexOutOfRangeException(); } return _elements[index]; } set { if (index >= Count) { ThrowIndexOutOfRangeException(); } _elements[index] = value; } } bool ICollection<T>.IsReadOnly => false; internal Builder(int capacity) { Requires.Range(capacity >= 0, "capacity"); _elements = new T[capacity]; _count = 0; } internal Builder() : this(8) { } private static void ThrowIndexOutOfRangeException() { throw new IndexOutOfRangeException(); } public ref readonly T ItemRef(int index) { if (index >= Count) { ThrowIndexOutOfRangeException(); } return ref _elements[index]; } public ImmutableArray<T> ToImmutable() { return new ImmutableArray<T>(ToArray()); } public ImmutableArray<T> MoveToImmutable() { if (Capacity != Count) { throw new InvalidOperationException(System.SR.CapacityMustEqualCountOnMove); } T[] elements = _elements; _elements = ImmutableArray<T>.Empty.array; _count = 0; return new ImmutableArray<T>(elements); } public void Clear() { Count = 0; } public void Insert(int index, T item) { Requires.Range(index >= 0 && index <= Count, "index"); EnsureCapacity(Count + 1); if (index < Count) { Array.Copy(_elements, index, _elements, index + 1, Count - index); } _count++; _elements[index] = item; } public void InsertRange(int index, IEnumerable<T> items) { Requires.Range(index >= 0 && index <= Count, "index"); Requires.NotNull(items, "items"); int count = ImmutableExtensions.GetCount(ref items); EnsureCapacity(Count + count); if (index != Count) { Array.Copy(_elements, index, _elements, index + count, _count - index); } if (!items.TryCopyTo(_elements, index)) { foreach (T item in items) { _elements[index++] = item; } } _count += count; } public void InsertRange(int index, ImmutableArray<T> items) { Requires.Range(index >= 0 && index <= Count, "index"); if (!items.IsEmpty) { EnsureCapacity(Count + items.Length); if (index != Count) { Array.Copy(_elements, index, _elements, index + items.Length, _count - index); } Array.Copy(items.array, 0, _elements, index, items.Length); _count += items.Length; } } public void Add(T item) { int num = _count + 1; EnsureCapacity(num); _elements[_count] = item; _count = num; } public void AddRange(IEnumerable<T> items) { Requires.NotNull(items, "items"); if (items.TryGetCount(out var count)) { EnsureCapacity(Count + count); if (items.TryCopyTo(_elements, _count)) { _count += count; return; } } foreach (T item in items) { Add(item); } } public void AddRange(params T[] items) { Requires.NotNull(items, "items"); int count = Count; Count += items.Length; Array.Copy(items, 0, _elements, count, items.Length); } public void AddRange<TDerived>(TDerived[] items) where TDerived : T { Requires.NotNull(items, "items"); int count = Count; Count += items.Length; Array.Copy(items, 0, _elements, count, items.Length); } public void AddRange(T[] items, int length) { Requires.NotNull(items, "items"); Requires.Range(length >= 0 && length <= items.Length, "length"); int count = Count; Count += length; Array.Copy(items, 0, _elements, count, length); } public void AddRange(ImmutableArray<T> items) { AddRange(items, items.Length); } public void AddRange(ImmutableArray<T> items, int length) { Requires.Range(length >= 0, "length"); if (items.array != null) { AddRange(items.array, length); } } public void AddRange(ReadOnlySpan<T> items) { int count = Count; Count += items.Length; items.CopyTo(new Span<T>(_elements, count, items.Length)); } public void AddRange<TDerived>(ReadOnlySpan<TDerived> items) where TDerived : T { int count = Count; Count += items.Length; Span<T> span = new Span<T>(_elements, count, items.Length); for (int i = 0; i < items.Length; i++) { span[i] = (T)(object)items[i]; } } public void AddRange<TDerived>(ImmutableArray<TDerived> items) where TDerived : T { if (items.array != null) { this.AddRange<TDerived>(items.array); } } public void AddRange(Builder items) { Requires.NotNull(items, "items"); AddRange(items._elements, items.Count); } public void AddRange<TDerived>(ImmutableArray<TDerived>.Builder items) where TDerived : T { Requires.NotNull(items, "items"); AddRange<TDerived>(items._elements, items.Count); } public bool Remove(T element) { int num = IndexOf(element); if (num >= 0) { RemoveAt(num); return true; } return false; } public bool Remove(T element, IEqualityComparer<T>? equalityComparer) { int num = IndexOf(element, 0, _count, equalityComparer); if (num >= 0) { RemoveAt(num); return true; } return false; } public void RemoveAll(Predicate<T> match) { List<int> list = null; for (int i = 0; i < _count; i++) { if (match(_elements[i])) { if (list == null) { list = new List<int>(); } list.Add(i); } } if (list != null) { RemoveAtRange(list); } } public void RemoveAt(int index) { Requires.Range(index >= 0 && index < Count, "index"); if (index < Count - 1) { Array.Copy(_elements, index + 1, _elements, index, Count - index - 1); } Count--; } public void RemoveRange(int index, int length) { Requires.Range(index >= 0 && index + length <= _count, "index"); if (length != 0) { if (index + length < _count) { Array.Copy(_elements, index + length, _elements, index, Count - index - length); } _count -= length; } } public void RemoveRange(IEnumerable<T> items) { RemoveRange(items, EqualityComparer<T>.Default); } public void RemoveRange(IEnumerable<T> items, IEqualityComparer<T>? equalityComparer) { Requires.NotNull(items, "items"); SortedSet<int> sortedSet = new SortedSet<int>(); foreach (T item in items) { int num = IndexOf(item, 0, _count, equalityComparer); while (num >= 0 && !sortedSet.Add(num) && num + 1 < _count) { num = IndexOf(item, num + 1, equalityComparer); } } RemoveAtRange(sortedSet); } public void Replace(T oldValue, T newValue) { Replace(oldValue, newValue, EqualityComparer<T>.Default); } public void Replace(T oldValue, T newValue, IEqualityComparer<T>? equalityComparer) { int num = IndexOf(oldValue, 0, _count, equalityComparer); if (num >= 0) { _elements[num] = newValue; } } public bool Contains(T item) { return IndexOf(item) >= 0; } public T[] ToArray() { if (Count == 0) { return ImmutableArray<T>.Empty.array; } T[] array = new T[Count]; Array.Copy(_elements, array, Count); return array; } public void CopyTo(T[] array, int index) { Requires.NotNull(array, "array"); Requires.Range(index >= 0 && index + Count <= array.Length, "index"); Array.Copy(_elements, 0, array, index, Count); } public void CopyTo(T[] destination) { Requires.NotNull(destination, "destination"); Array.Copy(_elements, 0, destination, 0, Count); } public void CopyTo(int sourceIndex, T[] destination, int destinationIndex, int length) { Requires.NotNull(destination, "destination"); Requires.Range(length >= 0, "length"); Requires.Range(sourceIndex >= 0 && sourceIndex + length <= Count, "sourceIndex"); Requires.Range(destinationIndex >= 0 && destinationIndex + length <= destination.Length, "destinationIndex"); Array.Copy(_elements, sourceIndex, destination, destinationIndex, length); } private void EnsureCapacity(int capacity) { if (_elements.Length < capacity) { int newSize = Math.Max(_elements.Length * 2, capacity); Array.Resize(ref _elements, newSize); } } public int IndexOf(T item) { return IndexOf(item, 0, _count, EqualityComparer<T>.Default); } public int IndexOf(T item, int startIndex) { return IndexOf(item, startIndex, Count - startIndex, EqualityComparer<T>.Default); } public int IndexOf(T item, int startIndex, int count) { return IndexOf(item, startIndex, count, EqualityComparer<T>.Default); } public int IndexOf(T item, int startIndex, int count, IEqualityComparer<T>? equalityComparer) { if (count == 0 && startIndex == 0) { return -1; } Requires.Range(startIndex >= 0 && startIndex < Count, "startIndex"); Requires.Range(count >= 0 && startIndex + count <= Count, "count"); if (equalityComparer == null) { equalityComparer = EqualityComparer<T>.Default; } if (equalityComparer == EqualityComparer<T>.Default) { return Array.IndexOf(_elements, item, startIndex, count); } for (int i = startIndex; i < startIndex + count; i++) { if (equalityComparer.Equals(_elements[i], item)) { return i; } } return -1; } public int IndexOf(T item, int startIndex, IEqualityComparer<T>? equalityComparer) { return IndexOf(item, startIndex, Count - startIndex, equalityComparer); } public int LastIndexOf(T item) { if (Count == 0) { return -1; } return LastIndexOf(item, Count - 1, Count, EqualityComparer<T>.Default); } public int LastIndexOf(T item, int startIndex) { if (Count == 0 && startIndex == 0) { return -1; } Requires.Range(startIndex >= 0 && startIndex < Count, "startIndex"); return LastIndexOf(item, startIndex, startIndex + 1, EqualityComparer<T>.Default); } public int LastIndexOf(T item, int startIndex, int count) { return LastIndexOf(item, startIndex, count, EqualityComparer<T>.Default); } public int LastIndexOf(T item, int startIndex, int count, IEqualityComparer<T>? equalityComparer) { if (count == 0 && startIndex == 0) { return -1; } Requires.Range(startIndex >= 0 && startIndex < Count, "startIndex"); Requires.Range(count >= 0 && startIndex - count + 1 >= 0, "count"); if (equalityComparer == null) { equalityComparer = EqualityComparer<T>.Default; } if (equalityComparer == EqualityComparer<T>.Default) { return Array.LastIndexOf(_elements, item, startIndex, count); } for (int num = startIndex; num >= startIndex - count + 1; num--) { if (equalityComparer.Equals(item, _elements[num])) { return num; } } return -1; } public void Reverse() { int num = 0; int num2 = _count - 1; T[] elements = _elements; while (num < num2) { T val = elements[num]; elements[num] = elements[num2]; elements[num2] = val; num++; num2--; } } public void Sort() { if (Count > 1) { Array.Sort(_elements, 0, Count, Comparer<T>.Default); } } public void Sort(Comparison<T> comparison) { Requires.NotNull(comparison, "comparison"); if (Count > 1) { Array.Sort(_elements, 0, _count, Comparer<T>.Create(comparison)); } } public void Sort(IComparer<T>? comparer) { if (Count > 1) { Array.Sort(_elements, 0, _count, comparer); } } public void Sort(int index, int count, IComparer<T>? comparer) { Requires.Range(index >= 0, "index"); Requires.Range(count >= 0 && index + count <= Count, "count"); if (count > 1) { Array.Sort(_elements, index, count, comparer); } } public void CopyTo(Span<T> destination) { Requires.Range(Count <= destination.Length, "destination"); new ReadOnlySpan<T>(_elements, 0, Count).CopyTo(destination); } public IEnumerator<T> GetEnumerator() { for (int i = 0; i < Count; i++) { yield return this[i]; } } IEnumerator<T> IEnumerable<T>.GetEnumerator() { return GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } private void AddRange<TDerived>(TDerived[] items, int length) where TDerived : T { EnsureCapacity(Count + length); int count = Count; Count += length; T[] elements = _elements; for (int i = 0; i < length; i++) { elements[count + i] = (T)(object)items[i]; } } private void RemoveAtRange(ICollection<int> indicesToRemove) { Requires.NotNull(indicesToRemove, "indicesToRemove"); if (indicesToRemove.Count == 0) { return; } int num = 0; int num2 = 0; int num3 = -1; foreach (int item in indicesToRemove) { int num4 = ((num3 == -1) ? item : (item - num3 - 1)); Array.Copy(_elements, num + num2, _elements, num, num4); num2++; num += num4; num3 = item; } Array.Copy(_elements, num + num2, _elements, num, _elements.Length - (num + num2)); _count -= indicesToRemove.Count; } } public struct Enumerator { private readonly T[] _array; private int _index; public T Current => _array[_index]; internal Enumerator(T[] array) { _array = array; _index = -1; } public bool MoveNext() { return ++_index < _array.Length; } } private sealed class EnumeratorObject : IEnumerator<T>, IDisposable, IEnumerator { private static readonly IEnumerator<T> s_EmptyEnumerator = new EnumeratorObject(ImmutableArray<T>.Empty.array); private readonly T[] _array; private int _index; public T Current { get { if ((uint)_index < (uint)_array.Length) { return _array[_index]; } throw new InvalidOperationException(); } } object IEnumerator.Current => Current; private EnumeratorObject(T[] array) { _index = -1; _array = array; } public bool MoveNext() { int num = _index + 1; int num2 = _array.Length; if ((uint)num <= (uint)num2) { _index = num; return (uint)num < (uint)num2; } return false; } void IEnumerator.Reset() { _index = -1; } public void Dispose() { } internal static IEnumerator<T> Create(T[] array) { if (array.Length != 0) { return new EnumeratorObject(array); } return s_EmptyEnumerator; } } public static readonly ImmutableArray<T> Empty = new ImmutableArray<T>(new T[0]); [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)] internal readonly T[]? array; T IList<T>.this[int index] { get { ImmutableArray<T> immutableArray = this; immutableArray.ThrowInvalidOperationIfNotInitialized(); return immutableArray[index]; } set { throw new NotSupportedException(); } } [DebuggerBrowsable(DebuggerBrowsableState.Never)] bool ICollection<T>.IsReadOnly => true; [DebuggerBrowsable(DebuggerBrowsableState.Never)] int ICollection<T>.Count { get { ImmutableArray<T> immutableArray = this; immutableArray.ThrowInvalidOperationIfNotInitialized(); return immutableArray.Length; } } [DebuggerBrowsable(DebuggerBrowsableState.Never)] int IReadOnlyCollection<T>.Count { get { ImmutableArray<T> immutableArray = this; immutableArray.ThrowInvalidOperationIfNotInitialized(); return immutableArray.Length; } } T IReadOnlyList<T>.this[int index] { get { ImmutableArray<T> immutableArray = this; immutableArray.ThrowInvalidOperationIfNotInitialized(); return immutableArray[index]; } } [DebuggerBrowsable(DebuggerBrowsableState.Never)] bool IList.IsFixedSize => true; [DebuggerBrowsable(DebuggerBrowsableState.Never)] bool IList.IsReadOnly => true; [DebuggerBrowsable(DebuggerBrowsableState.Never)] int ICollection.Count { get { ImmutableArray<T> immutableArray = this; immutableArray.ThrowInvalidOperationIfNotInitialized(); return immutableArray.Length; } } [DebuggerBrowsable(DebuggerBrowsableState.Never)] bool ICollection.IsSynchronized => true; [DebuggerBrowsable(DebuggerBrowsableState.Never)] object ICollection.SyncRoot { get { throw new NotSupportedException(); } } object? IList.this[int index] { get { ImmutableArray<T> immutableArray = this; immutableArray.ThrowInvalidOperationIfNotInitialized(); return immutableArray[index]; } set { throw new NotSupportedException(); } } public T this[int index] { [System.Runtime.Versioning.NonVersionable] get { return array[index]; } } [DebuggerBrowsable(DebuggerBrowsableState.Never)] public bool IsEmpty { [System.Runtime.Versioning.NonVersionable] get { return array.Length == 0; } } [DebuggerBrowsable(DebuggerBrowsableState.Never)] public int Length { [System.Runtime.Versioning.NonVersionable] get { return array.Length; } } [DebuggerBrowsable(DebuggerBrowsableState.Never)] public bool IsDefault => array == null; [DebuggerBrowsable(DebuggerBrowsableState.Never)] public bool IsDefaultOrEmpty { get { ImmutableArray<T> immutableArray = this; if (immutableArray.array != null) { return immutableArray.array.Length == 0; } return true; } } [DebuggerBrowsable(DebuggerBrowsableState.Never)] Array? IImmutableArray.Array => array; [DebuggerBrowsable(DebuggerBrowsableState.Never)] private string DebuggerDisplay { get { ImmutableArray<T> immutableArray = this; if (!immutableArray.IsDefault) { return $"Length = {immutableArray.Length}"; } return "Uninitialized"; } } public ReadOnlySpan<T> AsSpan() { return new ReadOnlySpan<T>(array); } public ReadOnlyMemory<T> AsMemory() { return new ReadOnlyMemory<T>(array); } public int IndexOf(T item) { ImmutableArray<T> immutableArray = this; return immutableArray.IndexOf(item, 0, immutableArray.Length, EqualityComparer<T>.Default); } public int IndexOf(T item, int startIndex, IEqualityComparer<T>? equalityComparer) { ImmutableArray<T> immutableArray = this; return immutableArray.IndexOf(item, startIndex, immutableArray.Length - startIndex, equalityComparer); } public int IndexOf(T item, int startIndex) { ImmutableArray<T> immutableArray = this; return immutableArray.IndexOf(item, startIndex, immutableArray.Length - startIndex, EqualityComparer<T>.Default); } public int IndexOf(T item, int startIndex, int count) { return IndexOf(item, startIndex, count, EqualityComparer<T>.Default); } public int IndexOf(T item, int startIndex, int count, IEqualityComparer<T>? equalityComparer) { ImmutableArray<T> immutableArray = this; immutableArray.ThrowNullRefIfNotInitialized(); if (count == 0 && startIndex == 0) { return -1; } Requires.Range(startIndex >= 0 && startIndex < immutableArray.Length, "startIndex"); Requires.Range(count >= 0 && startIndex + count <= immutableArray.Length, "count"); if (equalityComparer == null) { equalityComparer = EqualityComparer<T>.Default; } if (equalityComparer == EqualityComparer<T>.Default) { return Array.IndexOf(immutableArray.array, item, startIndex, count); } for (int i = startIndex; i < startIndex + count; i++) { if (equalityComparer.Equals(immutableArray.array[i], item)) { return i; } } return -1; } public int LastIndexOf(T item) { ImmutableArray<T> immutableArray = this; if (immutableArray.IsEmpty) { return -1; } return immutableArray.LastIndexOf(item, immutableArray.Length - 1, immutableArray.Length, EqualityComparer<T>.Default); } public int LastIndexOf(T item, int startIndex) { ImmutableArray<T> immutableArray = this; if (immutableArray.IsEmpty && startIndex == 0) { return -1; } return immutableArray.LastIndexOf(item, startIndex, startIndex + 1, EqualityComparer<T>.Default); } public int LastIndexOf(T item, int startIndex, int count) { return LastIndexOf(item, startIndex, count, EqualityComparer<T>.Default); } public int LastIndexOf(T item, int startIndex, int count, IEqualityComparer<T>? equalityComparer) { ImmutableArray<T> immutableArray = this; immutableArray.ThrowNullRefIfNotInitialized(); if (startIndex == 0 && count == 0) { return -1; } Requires.Range(startIndex >= 0 && startIndex < immutableArray.Length, "startIndex"); Requires.Range(count >= 0 && startIndex - count + 1 >= 0, "count"); if (equalityComparer == null) { equalityComparer = EqualityComparer<T>.Default; } if (equalityComparer == EqualityComparer<T>.Default) { return Array.LastIndexOf(immutableArray.array, item, startIndex, count); } for (int num = startIndex; num >= startIndex - count + 1; num--) { if (equalityComparer.Equals(item, immutableArray.array[num])) { return num; } } return -1; } public bool Contains(T item) { return IndexOf(item) >= 0; } public ImmutableArray<T> Insert(int index, T item) { ImmutableArray<T> immutableArray = this; immutableArray.ThrowNullRefIfNotInitialized(); Requires.Range(index >= 0 && index <= immutableArray.Length, "index"); if (immutableArray.IsEmpty) { return ImmutableArray.Create(item); } T[] array = new T[immutableArray.Length + 1]; array[index] = item; if (index != 0) { Array.Copy(immutableArray.array, array, index); } if (index != immutableArray.Length) { Array.Copy(immutableArray.array, index, array, index + 1, immutableArray.Length - index); } return new ImmutableArray<T>(array); } public ImmutableArray<T> InsertRange(int index, IEnumerable<T> items) { ImmutableArray<T> result = this; result.ThrowNullRefIfNotInitialized(); Requires.Range(index >= 0 && index <= result.Length, "index"); Requires.NotNull(items, "items"); if (result.IsEmpty) { return ImmutableArray.CreateRange(items); } int count = ImmutableExtensions.GetCount(ref items); if (count == 0) { return result; } T[] array = new T[result.Length + count]; if (index != 0) { Array.Copy(result.array, array, index); } if (index != result.Length) { Array.Copy(result.array, index, array, index + count, result.Length - index); } if (!items.TryCopyTo(array, index)) { int num = index; foreach (T item in items) { array[num++] = item; } } return new ImmutableArray<T>(array); } public ImmutableArray<T> InsertRange(int index, ImmutableArray<T> items) { ImmutableArray<T> result = this; result.ThrowNullRefIfNotInitialized(); items.ThrowNullRefIfNotInitialized(); Requires.Range(index >= 0 && index <= result.Length, "index"); if (result.IsEmpty) { return items; } if (items.IsEmpty) { return result; } return result.InsertSpanRangeInternal(index, items.AsSpan()); } public ImmutableArray<T> Add(T item) { ImmutableArray<T> immutableArray = this; if (immutableArray.IsEmpty) { return ImmutableArray.Create(item); } return immutableArray.Insert(immutableArray.Length, item); } public ImmutableArray<T> AddRange(IEnumerable<T> items) { ImmutableArray<T> immutableArray = this; return immutableArray.InsertRange(immutableArray.Length, items); } public ImmutableArray<T> AddRange(T[] items, int length) { ImmutableArray<T> result = this; result.ThrowNullRefIfNotInitialized(); Requires.NotNull(items, "items"); Requires.Range(length >= 0 && length <= items.Length, "length"); if (items.Length == 0 || length == 0) { return result; } if (result.IsEmpty) { return ImmutableArray.Create(items, 0, length); } T[] array = new T[result.Length + length]; Array.Copy(result.array, array, result.Length); Array.Copy(items, 0, array, result.Length, length); return new ImmutableArray<T>(array); } public ImmutableArray<T> AddRange<TDerived>(TDerived[] items) where TDerived : T { ImmutableArray<T> result = this; result.ThrowNullRefIfNotInitialized(); Requires.NotNull(items, "items"); if (items.Length == 0) { return result; } T[] array = new T[result.Length + items.Length]; Array.Copy(result.array, array, result.Length); Array.Copy(items, 0, array, result.Length, items.Length); return new ImmutableArray<T>(array); } public ImmutableArray<T> AddRange(ImmutableArray<T> items, int length) { ImmutableArray<T> result = this; Requires.Range(length >= 0, "length"); if (items.array != null) { return result.AddRange(items.array, length); } return result; } public ImmutableArray<T> AddRange<TDerived>(ImmutableArray<TDerived> items) where TDerived : T { ImmutableArray<T> result = this; if (items.array != null) { return result.AddRange<TDerived>(items.array); } return result; } public ImmutableArray<T> AddRange(ImmutableArray<T> items) { ImmutableArray<T> immutableArray = this; return immutableArray.InsertRange(immutableArray.Length, items); } public ImmutableArray<T> SetItem(int index, T item) { ImmutableArray<T> immutableArray = this; immutableArray.ThrowNullRefIfNotInitialized(); Requires.Range(index >= 0 && index < immutableArray.Length, "index"); T[] array = new T[immutableArray.Length]; Array.Copy(immutableArray.array, array, immutableArray.Length); array[index] = item; return new ImmutableArray<T>(array); } public ImmutableArray<T> Replace(T oldValue, T newValue) { return Replace(oldValue, newValue, EqualityComparer<T>.Default); } public ImmutableArray<T> Replace(T oldValue, T newValue, IEqualityComparer<T>? equalityComparer) { ImmutableArray<T> immutableArray = this; int num = immutableArray.IndexOf(oldValue, 0, immutableArray.Length, equalityComparer); if (num < 0) { throw new ArgumentException(System.SR.CannotFindOldValue, "oldValue"); } return immutableArray.SetItem(num, newValue); } public ImmutableArray<T> Remove(T item) { return Remove(item, EqualityComparer<T>.Default); } public ImmutableArray<T> Remove(T item, IEqualityComparer<T>? equalityComparer) { ImmutableArray<T> result = this; result.ThrowNullRefIfNotInitialized(); int num = result.IndexOf(item, 0, result.Length, equalityComparer); if (num >= 0) { return result.RemoveAt(num); } return result; } public ImmutableArray<T> RemoveAt(int index) { return RemoveRange(index, 1); } public ImmutableArray<T> RemoveRange(int index, int length) { ImmutableArray<T> result = this; result.ThrowNullRefIfNotInitialized(); Requires.Range(index >= 0 && index <= result.Length, "index"); Requires.Range(length >= 0 && index + length <= result.Length, "length"); if (length == 0) { return result; } T[] array = new T[result.Length - length]; Array.Copy(result.array, array, index); Array.Copy(result.array, index + length, array, index, result.Length - index - length); return new ImmutableArray<T>(array); } public ImmutableArray<T> RemoveRange(IEnumerable<T> items) { return RemoveRange(items, EqualityComparer<T>.Default); } public ImmutableArray<T> RemoveRange(IEnumerable<T> items, IEqualityComparer<T>? equalityComparer) { ImmutableArray<T> immutableArray = this; immutableArray.ThrowNullRefIfNotInitialized(); Requires.NotNull(items, "items"); SortedSet<int> sortedSet = new SortedSet<int>(); foreach (T item in items) { int num = -1; do { num = immutableArray.IndexOf(item, num + 1, equalityComparer); } while (nu
plugins/System.Memory.dll
Decompiled 16 hours ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Buffers; using System.Buffers.Binary; using System.Buffers.Text; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.Numerics; using System.Numerics.Hashing; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Security; using System.Security.Permissions; using System.Text; using FxResources.System.Memory; using Microsoft.CodeAnalysis; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: NeutralResourcesLanguage("en-US")] [assembly: AssemblyTitle("System.Memory")] [assembly: AssemblyDescription("System.Memory")] [assembly: AssemblyDefaultAlias("System.Memory")] [assembly: AssemblyCompany("Microsoft Corporation")] [assembly: AssemblyProduct("Microsoft® .NET Framework")] [assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")] [assembly: AssemblyFileVersion("4.6.31308.01")] [assembly: AssemblyInformationalVersion("4.6.31308.01 @BuiltBy: cloudtest-841353dfc000000 @Branch: release/2.1-MSRC @SrcCode: https://github.com/dotnet/corefx/tree/32b491939fbd125f304031c35038b1e14b4e3958")] [assembly: CLSCompliant(true)] [assembly: AssemblyMetadata(".NETFrameworkAssembly", "")] [assembly: AssemblyMetadata("Serviceable", "True")] [assembly: AssemblyMetadata("PreferInbox", "True")] [assembly: DefaultDllImportSearchPaths(DllImportSearchPath.System32 | DllImportSearchPath.AssemblyDirectory)] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("4.0.1.2")] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class IsReadOnlyAttribute : Attribute { } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class IsByRefLikeAttribute : Attribute { } } namespace FxResources.System.Memory { internal static class SR { } } namespace System { public readonly struct SequencePosition : IEquatable<SequencePosition> { private readonly object _object; private readonly int _integer; public SequencePosition(object @object, int integer) { _object = @object; _integer = integer; } [EditorBrowsable(EditorBrowsableState.Never)] public object GetObject() { return _object; } [EditorBrowsable(EditorBrowsableState.Never)] public int GetInteger() { return _integer; } public bool Equals(SequencePosition other) { if (_integer == other._integer) { return object.Equals(_object, other._object); } return false; } [EditorBrowsable(EditorBrowsableState.Never)] public override bool Equals(object obj) { if (obj is SequencePosition other) { return Equals(other); } return false; } [EditorBrowsable(EditorBrowsableState.Never)] public override int GetHashCode() { return HashHelpers.Combine(_object?.GetHashCode() ?? 0, _integer); } } internal static class ThrowHelper { internal static void ThrowArgumentNullException(System.ExceptionArgument argument) { throw CreateArgumentNullException(argument); } [MethodImpl(MethodImplOptions.NoInlining)] private static Exception CreateArgumentNullException(System.ExceptionArgument argument) { return new ArgumentNullException(argument.ToString()); } internal static void ThrowArrayTypeMismatchException() { throw CreateArrayTypeMismatchException(); } [MethodImpl(MethodImplOptions.NoInlining)] private static Exception CreateArrayTypeMismatchException() { return new ArrayTypeMismatchException(); } internal static void ThrowArgumentException_InvalidTypeWithPointersNotSupported(Type type) { throw CreateArgumentException_InvalidTypeWithPointersNotSupported(type); } [MethodImpl(MethodImplOptions.NoInlining)] private static Exception CreateArgumentException_InvalidTypeWithPointersNotSupported(Type type) { return new ArgumentException(System.SR.Format(System.SR.Argument_InvalidTypeWithPointersNotSupported, type)); } internal static void ThrowArgumentException_DestinationTooShort() { throw CreateArgumentException_DestinationTooShort(); } [MethodImpl(MethodImplOptions.NoInlining)] private static Exception CreateArgumentException_DestinationTooShort() { return new ArgumentException(System.SR.Argument_DestinationTooShort); } internal static void ThrowIndexOutOfRangeException() { throw CreateIndexOutOfRangeException(); } [MethodImpl(MethodImplOptions.NoInlining)] private static Exception CreateIndexOutOfRangeException() { return new IndexOutOfRangeException(); } internal static void ThrowArgumentOutOfRangeException() { throw CreateArgumentOutOfRangeException(); } [MethodImpl(MethodImplOptions.NoInlining)] private static Exception CreateArgumentOutOfRangeException() { return new ArgumentOutOfRangeException(); } internal static void ThrowArgumentOutOfRangeException(System.ExceptionArgument argument) { throw CreateArgumentOutOfRangeException(argument); } [MethodImpl(MethodImplOptions.NoInlining)] private static Exception CreateArgumentOutOfRangeException(System.ExceptionArgument argument) { return new ArgumentOutOfRangeException(argument.ToString()); } internal static void ThrowArgumentOutOfRangeException_PrecisionTooLarge() { throw CreateArgumentOutOfRangeException_PrecisionTooLarge(); } [MethodImpl(MethodImplOptions.NoInlining)] private static Exception CreateArgumentOutOfRangeException_PrecisionTooLarge() { return new ArgumentOutOfRangeException("precision", System.SR.Format(System.SR.Argument_PrecisionTooLarge, (byte)99)); } internal static void ThrowArgumentOutOfRangeException_SymbolDoesNotFit() { throw CreateArgumentOutOfRangeException_SymbolDoesNotFit(); } [MethodImpl(MethodImplOptions.NoInlining)] private static Exception CreateArgumentOutOfRangeException_SymbolDoesNotFit() { return new ArgumentOutOfRangeException("symbol", System.SR.Argument_BadFormatSpecifier); } internal static void ThrowInvalidOperationException() { throw CreateInvalidOperationException(); } [MethodImpl(MethodImplOptions.NoInlining)] private static Exception CreateInvalidOperationException() { return new InvalidOperationException(); } internal static void ThrowInvalidOperationException_OutstandingReferences() { throw CreateInvalidOperationException_OutstandingReferences(); } [MethodImpl(MethodImplOptions.NoInlining)] private static Exception CreateInvalidOperationException_OutstandingReferences() { return new InvalidOperationException(System.SR.OutstandingReferences); } internal static void ThrowInvalidOperationException_UnexpectedSegmentType() { throw CreateInvalidOperationException_UnexpectedSegmentType(); } [MethodImpl(MethodImplOptions.NoInlining)] private static Exception CreateInvalidOperationException_UnexpectedSegmentType() { return new InvalidOperationException(System.SR.UnexpectedSegmentType); } internal static void ThrowInvalidOperationException_EndPositionNotReached() { throw CreateInvalidOperationException_EndPositionNotReached(); } [MethodImpl(MethodImplOptions.NoInlining)] private static Exception CreateInvalidOperationException_EndPositionNotReached() { return new InvalidOperationException(System.SR.EndPositionNotReached); } internal static void ThrowArgumentOutOfRangeException_PositionOutOfRange() { throw CreateArgumentOutOfRangeException_PositionOutOfRange(); } [MethodImpl(MethodImplOptions.NoInlining)] private static Exception CreateArgumentOutOfRangeException_PositionOutOfRange() { return new ArgumentOutOfRangeException("position"); } internal static void ThrowArgumentOutOfRangeException_OffsetOutOfRange() { throw CreateArgumentOutOfRangeException_OffsetOutOfRange(); } [MethodImpl(MethodImplOptions.NoInlining)] private static Exception CreateArgumentOutOfRangeException_OffsetOutOfRange() { return new ArgumentOutOfRangeException("offset"); } internal static void ThrowObjectDisposedException_ArrayMemoryPoolBuffer() { throw CreateObjectDisposedException_ArrayMemoryPoolBuffer(); } [MethodImpl(MethodImplOptions.NoInlining)] private static Exception CreateObjectDisposedException_ArrayMemoryPoolBuffer() { return new ObjectDisposedException("ArrayMemoryPoolBuffer"); } internal static void ThrowFormatException_BadFormatSpecifier() { throw CreateFormatException_BadFormatSpecifier(); } [MethodImpl(MethodImplOptions.NoInlining)] private static Exception CreateFormatException_BadFormatSpecifier() { return new FormatException(System.SR.Argument_BadFormatSpecifier); } internal static void ThrowArgumentException_OverlapAlignmentMismatch() { throw CreateArgumentException_OverlapAlignmentMismatch(); } [MethodImpl(MethodImplOptions.NoInlining)] private static Exception CreateArgumentException_OverlapAlignmentMismatch() { return new ArgumentException(System.SR.Argument_OverlapAlignmentMismatch); } internal static void ThrowNotSupportedException() { throw CreateThrowNotSupportedException(); } [MethodImpl(MethodImplOptions.NoInlining)] private static Exception CreateThrowNotSupportedException() { return new NotSupportedException(); } public static bool TryFormatThrowFormatException(out int bytesWritten) { bytesWritten = 0; ThrowFormatException_BadFormatSpecifier(); return false; } public static bool TryParseThrowFormatException<T>(out T value, out int bytesConsumed) { value = default(T); bytesConsumed = 0; ThrowFormatException_BadFormatSpecifier(); return false; } public static void ThrowArgumentValidationException<T>(ReadOnlySequenceSegment<T> startSegment, int startIndex, ReadOnlySequenceSegment<T> endSegment) { throw CreateArgumentValidationException(startSegment, startIndex, endSegment); } private static Exception CreateArgumentValidationException<T>(ReadOnlySequenceSegment<T> startSegment, int startIndex, ReadOnlySequenceSegment<T> endSegment) { if (startSegment == null) { return CreateArgumentNullException(System.ExceptionArgument.startSegment); } if (endSegment == null) { return CreateArgumentNullException(System.ExceptionArgument.endSegment); } if (startSegment != endSegment && startSegment.RunningIndex > endSegment.RunningIndex) { return CreateArgumentOutOfRangeException(System.ExceptionArgument.endSegment); } if ((uint)startSegment.Memory.Length < (uint)startIndex) { return CreateArgumentOutOfRangeException(System.ExceptionArgument.startIndex); } return CreateArgumentOutOfRangeException(System.ExceptionArgument.endIndex); } public static void ThrowArgumentValidationException(Array array, int start) { throw CreateArgumentValidationException(array, start); } private static Exception CreateArgumentValidationException(Array array, int start) { if (array == null) { return CreateArgumentNullException(System.ExceptionArgument.array); } if ((uint)start > (uint)array.Length) { return CreateArgumentOutOfRangeException(System.ExceptionArgument.start); } return CreateArgumentOutOfRangeException(System.ExceptionArgument.length); } public static void ThrowStartOrEndArgumentValidationException(long start) { throw CreateStartOrEndArgumentValidationException(start); } private static Exception CreateStartOrEndArgumentValidationException(long start) { if (start < 0) { return CreateArgumentOutOfRangeException(System.ExceptionArgument.start); } return CreateArgumentOutOfRangeException(System.ExceptionArgument.length); } } internal enum ExceptionArgument { length, start, minimumBufferSize, elementIndex, comparable, comparer, destination, offset, startSegment, endSegment, startIndex, endIndex, array, culture, manager } internal static class DecimalDecCalc { private static uint D32DivMod1E9(uint hi32, ref uint lo32) { ulong num = ((ulong)hi32 << 32) | lo32; lo32 = (uint)(num / 1000000000); return (uint)(num % 1000000000); } internal static uint DecDivMod1E9(ref MutableDecimal value) { return D32DivMod1E9(D32DivMod1E9(D32DivMod1E9(0u, ref value.High), ref value.Mid), ref value.Low); } internal static void DecAddInt32(ref MutableDecimal value, uint i) { if (D32AddCarry(ref value.Low, i) && D32AddCarry(ref value.Mid, 1u)) { D32AddCarry(ref value.High, 1u); } } private static bool D32AddCarry(ref uint value, uint i) { uint num = value; uint num2 = (value = num + i); if (num2 >= num) { return num2 < i; } return true; } internal static void DecMul10(ref MutableDecimal value) { MutableDecimal d = value; DecShiftLeft(ref value); DecShiftLeft(ref value); DecAdd(ref value, d); DecShiftLeft(ref value); } private static void DecShiftLeft(ref MutableDecimal value) { uint num = (((value.Low & 0x80000000u) != 0) ? 1u : 0u); uint num2 = (((value.Mid & 0x80000000u) != 0) ? 1u : 0u); value.Low <<= 1; value.Mid = (value.Mid << 1) | num; value.High = (value.High << 1) | num2; } private static void DecAdd(ref MutableDecimal value, MutableDecimal d) { if (D32AddCarry(ref value.Low, d.Low) && D32AddCarry(ref value.Mid, 1u)) { D32AddCarry(ref value.High, 1u); } if (D32AddCarry(ref value.Mid, d.Mid)) { D32AddCarry(ref value.High, 1u); } D32AddCarry(ref value.High, d.High); } } internal static class Number { private static class DoubleHelper { public unsafe static uint Exponent(double d) { return (*(uint*)((byte*)(&d) + 4) >> 20) & 0x7FFu; } public unsafe static ulong Mantissa(double d) { return *(uint*)(&d) | ((ulong)(uint)(*(int*)((byte*)(&d) + 4) & 0xFFFFF) << 32); } public unsafe static bool Sign(double d) { return *(uint*)((byte*)(&d) + 4) >> 31 != 0; } } internal const int DECIMAL_PRECISION = 29; private static readonly ulong[] s_rgval64Power10 = new ulong[30] { 11529215046068469760uL, 14411518807585587200uL, 18014398509481984000uL, 11258999068426240000uL, 14073748835532800000uL, 17592186044416000000uL, 10995116277760000000uL, 13743895347200000000uL, 17179869184000000000uL, 10737418240000000000uL, 13421772800000000000uL, 16777216000000000000uL, 10485760000000000000uL, 13107200000000000000uL, 16384000000000000000uL, 14757395258967641293uL, 11805916207174113035uL, 9444732965739290428uL, 15111572745182864686uL, 12089258196146291749uL, 9671406556917033399uL, 15474250491067253438uL, 12379400392853802751uL, 9903520314283042201uL, 15845632502852867522uL, 12676506002282294018uL, 10141204801825835215uL, 16225927682921336344uL, 12980742146337069075uL, 10384593717069655260uL }; private static readonly sbyte[] s_rgexp64Power10 = new sbyte[15] { 4, 7, 10, 14, 17, 20, 24, 27, 30, 34, 37, 40, 44, 47, 50 }; private static readonly ulong[] s_rgval64Power10By16 = new ulong[42] { 10240000000000000000uL, 11368683772161602974uL, 12621774483536188886uL, 14012984643248170708uL, 15557538194652854266uL, 17272337110188889248uL, 9588073174409622172uL, 10644899600020376798uL, 11818212630765741798uL, 13120851772591970216uL, 14567071740625403792uL, 16172698447808779622uL, 17955302187076837696uL, 9967194951097567532uL, 11065809325636130658uL, 12285516299433008778uL, 13639663065038175358uL, 15143067982934716296uL, 16812182738118149112uL, 9332636185032188787uL, 10361307573072618722uL, 16615349947311448416uL, 14965776766268445891uL, 13479973333575319909uL, 12141680576410806707uL, 10936253623915059637uL, 9850501549098619819uL, 17745086042373215136uL, 15983352577617880260uL, 14396524142538228461uL, 12967236152753103031uL, 11679847981112819795uL, 10520271803096747049uL, 9475818434452569218uL, 17070116948172427008uL, 15375394465392026135uL, 13848924157002783096uL, 12474001934591998882uL, 11235582092889474480uL, 10120112665365530972uL, 18230774251475056952uL, 16420821625123739930uL }; private static readonly short[] s_rgexp64Power10By16 = new short[21] { 54, 107, 160, 213, 266, 319, 373, 426, 479, 532, 585, 638, 691, 745, 798, 851, 904, 957, 1010, 1064, 1117 }; public static void RoundNumber(ref NumberBuffer number, int pos) { Span<byte> digits = number.Digits; int i; for (i = 0; i < pos && digits[i] != 0; i++) { } if (i == pos && digits[i] >= 53) { while (i > 0 && digits[i - 1] == 57) { i--; } if (i > 0) { digits[i - 1]++; } else { number.Scale++; digits[0] = 49; i = 1; } } else { while (i > 0 && digits[i - 1] == 48) { i--; } } if (i == 0) { number.Scale = 0; number.IsNegative = false; } digits[i] = 0; } internal static bool NumberBufferToDouble(ref NumberBuffer number, out double value) { double num = NumberToDouble(ref number); uint num2 = DoubleHelper.Exponent(num); ulong num3 = DoubleHelper.Mantissa(num); switch (num2) { case 2047u: value = 0.0; return false; case 0u: if (num3 == 0L) { num = 0.0; } break; } value = num; return true; } public unsafe static bool NumberBufferToDecimal(ref NumberBuffer number, ref decimal value) { MutableDecimal value2 = default(MutableDecimal); byte* ptr = number.UnsafeDigits; int num = number.Scale; if (*ptr == 0) { if (num > 0) { num = 0; } } else { if (num > 29) { return false; } while ((num > 0 || (*ptr != 0 && num > -28)) && (value2.High < 429496729 || (value2.High == 429496729 && (value2.Mid < 2576980377u || (value2.Mid == 2576980377u && (value2.Low < 2576980377u || (value2.Low == 2576980377u && *ptr <= 53))))))) { DecimalDecCalc.DecMul10(ref value2); if (*ptr != 0) { DecimalDecCalc.DecAddInt32(ref value2, (uint)(*(ptr++) - 48)); } num--; } if (*(ptr++) >= 53) { bool flag = true; if (*(ptr - 1) == 53 && *(ptr - 2) % 2 == 0) { int num2 = 20; while (*ptr == 48 && num2 != 0) { ptr++; num2--; } if (*ptr == 0 || num2 == 0) { flag = false; } } if (flag) { DecimalDecCalc.DecAddInt32(ref value2, 1u); if ((value2.High | value2.Mid | value2.Low) == 0) { value2.High = 429496729u; value2.Mid = 2576980377u; value2.Low = 2576980378u; num++; } } } } if (num > 0) { return false; } if (num <= -29) { value2.High = 0u; value2.Low = 0u; value2.Mid = 0u; value2.Scale = 28; } else { value2.Scale = -num; } value2.IsNegative = number.IsNegative; value = System.Runtime.CompilerServices.Unsafe.As<MutableDecimal, decimal>(ref value2); return true; } public static void DecimalToNumber(decimal value, ref NumberBuffer number) { ref MutableDecimal reference = ref System.Runtime.CompilerServices.Unsafe.As<decimal, MutableDecimal>(ref value); Span<byte> digits = number.Digits; number.IsNegative = reference.IsNegative; int num = 29; while ((reference.Mid != 0) | (reference.High != 0)) { uint num2 = DecimalDecCalc.DecDivMod1E9(ref reference); for (int i = 0; i < 9; i++) { digits[--num] = (byte)(num2 % 10 + 48); num2 /= 10; } } for (uint num3 = reference.Low; num3 != 0; num3 /= 10) { digits[--num] = (byte)(num3 % 10 + 48); } int num4 = 29 - num; number.Scale = num4 - reference.Scale; Span<byte> digits2 = number.Digits; int index = 0; while (--num4 >= 0) { digits2[index++] = digits[num++]; } digits2[index] = 0; } private static uint DigitsToInt(ReadOnlySpan<byte> digits, int count) { uint value; int bytesConsumed; bool flag = Utf8Parser.TryParse(digits.Slice(0, count), out value, out bytesConsumed, 'D'); return value; } private static ulong Mul32x32To64(uint a, uint b) { return (ulong)a * (ulong)b; } private static ulong Mul64Lossy(ulong a, ulong b, ref int pexp) { ulong num = Mul32x32To64((uint)(a >> 32), (uint)(b >> 32)) + (Mul32x32To64((uint)(a >> 32), (uint)b) >> 32) + (Mul32x32To64((uint)a, (uint)(b >> 32)) >> 32); if ((num & 0x8000000000000000uL) == 0L) { num <<= 1; pexp--; } return num; } private static int abs(int value) { if (value < 0) { return -value; } return value; } private unsafe static double NumberToDouble(ref NumberBuffer number) { ReadOnlySpan<byte> digits = number.Digits; int i = 0; int numDigits = number.NumDigits; int num = numDigits; for (; digits[i] == 48; i++) { num--; } if (num == 0) { return 0.0; } int num2 = Math.Min(num, 9); num -= num2; ulong num3 = DigitsToInt(digits, num2); if (num > 0) { num2 = Math.Min(num, 9); num -= num2; uint b = (uint)(s_rgval64Power10[num2 - 1] >> 64 - s_rgexp64Power10[num2 - 1]); num3 = Mul32x32To64((uint)num3, b) + DigitsToInt(digits.Slice(9), num2); } int num4 = number.Scale - (numDigits - num); int num5 = abs(num4); if (num5 >= 352) { ulong num6 = ((num4 > 0) ? 9218868437227405312uL : 0); if (number.IsNegative) { num6 |= 0x8000000000000000uL; } return *(double*)(&num6); } int pexp = 64; if ((num3 & 0xFFFFFFFF00000000uL) == 0L) { num3 <<= 32; pexp -= 32; } if ((num3 & 0xFFFF000000000000uL) == 0L) { num3 <<= 16; pexp -= 16; } if ((num3 & 0xFF00000000000000uL) == 0L) { num3 <<= 8; pexp -= 8; } if ((num3 & 0xF000000000000000uL) == 0L) { num3 <<= 4; pexp -= 4; } if ((num3 & 0xC000000000000000uL) == 0L) { num3 <<= 2; pexp -= 2; } if ((num3 & 0x8000000000000000uL) == 0L) { num3 <<= 1; pexp--; } int num7 = num5 & 0xF; if (num7 != 0) { int num8 = s_rgexp64Power10[num7 - 1]; pexp += ((num4 < 0) ? (-num8 + 1) : num8); ulong b2 = s_rgval64Power10[num7 + ((num4 < 0) ? 15 : 0) - 1]; num3 = Mul64Lossy(num3, b2, ref pexp); } num7 = num5 >> 4; if (num7 != 0) { int num9 = s_rgexp64Power10By16[num7 - 1]; pexp += ((num4 < 0) ? (-num9 + 1) : num9); ulong b3 = s_rgval64Power10By16[num7 + ((num4 < 0) ? 21 : 0) - 1]; num3 = Mul64Lossy(num3, b3, ref pexp); } if (((uint)(int)num3 & 0x400u) != 0) { ulong num10 = num3 + 1023 + (ulong)(((int)num3 >> 11) & 1); if (num10 < num3) { num10 = (num10 >> 1) | 0x8000000000000000uL; pexp++; } num3 = num10; } pexp += 1022; num3 = ((pexp <= 0) ? ((pexp == -52 && num3 >= 9223372036854775896uL) ? 1 : ((pexp > -52) ? (num3 >> -pexp + 11 + 1) : 0)) : ((pexp < 2047) ? ((ulong)((long)pexp << 52) + ((num3 >> 11) & 0xFFFFFFFFFFFFFL)) : 9218868437227405312uL)); if (number.IsNegative) { num3 |= 0x8000000000000000uL; } return *(double*)(&num3); } } internal ref struct NumberBuffer { public int Scale; public bool IsNegative; public const int BufferSize = 51; private byte _b0; private byte _b1; private byte _b2; private byte _b3; private byte _b4; private byte _b5; private byte _b6; private byte _b7; private byte _b8; private byte _b9; private byte _b10; private byte _b11; private byte _b12; private byte _b13; private byte _b14; private byte _b15; private byte _b16; private byte _b17; private byte _b18; private byte _b19; private byte _b20; private byte _b21; private byte _b22; private byte _b23; private byte _b24; private byte _b25; private byte _b26; private byte _b27; private byte _b28; private byte _b29; private byte _b30; private byte _b31; private byte _b32; private byte _b33; private byte _b34; private byte _b35; private byte _b36; private byte _b37; private byte _b38; private byte _b39; private byte _b40; private byte _b41; private byte _b42; private byte _b43; private byte _b44; private byte _b45; private byte _b46; private byte _b47; private byte _b48; private byte _b49; private byte _b50; public unsafe Span<byte> Digits => new Span<byte>(System.Runtime.CompilerServices.Unsafe.AsPointer<byte>(ref _b0), 51); public unsafe byte* UnsafeDigits => (byte*)System.Runtime.CompilerServices.Unsafe.AsPointer<byte>(ref _b0); public int NumDigits => Digits.IndexOf<byte>(0); [Conditional("DEBUG")] public void CheckConsistency() { } public override string ToString() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append('['); stringBuilder.Append('"'); Span<byte> digits = Digits; for (int i = 0; i < 51; i++) { byte b = digits[i]; if (b == 0) { break; } stringBuilder.Append((char)b); } stringBuilder.Append('"'); stringBuilder.Append(", Scale = " + Scale); stringBuilder.Append(", IsNegative = " + IsNegative); stringBuilder.Append(']'); return stringBuilder.ToString(); } } [DebuggerTypeProxy(typeof(System.MemoryDebugView<>))] [DebuggerDisplay("{ToString(),raw}")] public readonly struct Memory<T> { private readonly object _object; private readonly int _index; private readonly int _length; private const int RemoveFlagsBitMask = int.MaxValue; public static Memory<T> Empty => default(Memory<T>); public int Length => _length & 0x7FFFFFFF; public bool IsEmpty => (_length & 0x7FFFFFFF) == 0; public Span<T> Span { [MethodImpl(MethodImplOptions.AggressiveInlining)] get { Span<T> result; if (_index < 0) { result = ((MemoryManager<T>)_object).GetSpan(); return result.Slice(_index & 0x7FFFFFFF, _length); } if (typeof(T) == typeof(char) && _object is string text) { result = new Span<T>(System.Runtime.CompilerServices.Unsafe.As<Pinnable<T>>((object)text), MemoryExtensions.StringAdjustment, text.Length); return result.Slice(_index, _length); } if (_object != null) { return new Span<T>((T[])_object, _index, _length & 0x7FFFFFFF); } result = default(Span<T>); return result; } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public Memory(T[] array) { if (array == null) { this = default(Memory<T>); return; } if (default(T) == null && array.GetType() != typeof(T[])) { System.ThrowHelper.ThrowArrayTypeMismatchException(); } _object = array; _index = 0; _length = array.Length; } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal Memory(T[] array, int start) { if (array == null) { if (start != 0) { System.ThrowHelper.ThrowArgumentOutOfRangeException(); } this = default(Memory<T>); return; } if (default(T) == null && array.GetType() != typeof(T[])) { System.ThrowHelper.ThrowArrayTypeMismatchException(); } if ((uint)start > (uint)array.Length) { System.ThrowHelper.ThrowArgumentOutOfRangeException(); } _object = array; _index = start; _length = array.Length - start; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public Memory(T[] array, int start, int length) { if (array == null) { if (start != 0 || length != 0) { System.ThrowHelper.ThrowArgumentOutOfRangeException(); } this = default(Memory<T>); return; } if (default(T) == null && array.GetType() != typeof(T[])) { System.ThrowHelper.ThrowArrayTypeMismatchException(); } if ((uint)start > (uint)array.Length || (uint)length > (uint)(array.Length - start)) { System.ThrowHelper.ThrowArgumentOutOfRangeException(); } _object = array; _index = start; _length = length; } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal Memory(MemoryManager<T> manager, int length) { if (length < 0) { System.ThrowHelper.ThrowArgumentOutOfRangeException(); } _object = manager; _index = int.MinValue; _length = length; } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal Memory(MemoryManager<T> manager, int start, int length) { if (length < 0 || start < 0) { System.ThrowHelper.ThrowArgumentOutOfRangeException(); } _object = manager; _index = start | int.MinValue; _length = length; } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal Memory(object obj, int start, int length) { _object = obj; _index = start; _length = length; } public static implicit operator Memory<T>(T[] array) { return new Memory<T>(array); } public static implicit operator Memory<T>(ArraySegment<T> segment) { return new Memory<T>(segment.Array, segment.Offset, segment.Count); } public static implicit operator ReadOnlyMemory<T>(Memory<T> memory) { return System.Runtime.CompilerServices.Unsafe.As<Memory<T>, ReadOnlyMemory<T>>(ref memory); } public override string ToString() { if (typeof(T) == typeof(char)) { if (!(_object is string text)) { return Span.ToString(); } return text.Substring(_index, _length & 0x7FFFFFFF); } return $"System.Memory<{typeof(T).Name}>[{_length & 0x7FFFFFFF}]"; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public Memory<T> Slice(int start) { int length = _length; int num = length & 0x7FFFFFFF; if ((uint)start > (uint)num) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.start); } return new Memory<T>(_object, _index + start, length - start); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public Memory<T> Slice(int start, int length) { int length2 = _length; int num = length2 & 0x7FFFFFFF; if ((uint)start > (uint)num || (uint)length > (uint)(num - start)) { System.ThrowHelper.ThrowArgumentOutOfRangeException(); } return new Memory<T>(_object, _index + start, length | (length2 & int.MinValue)); } public void CopyTo(Memory<T> destination) { Span.CopyTo(destination.Span); } public bool TryCopyTo(Memory<T> destination) { return Span.TryCopyTo(destination.Span); } public unsafe MemoryHandle Pin() { if (_index < 0) { return ((MemoryManager<T>)_object).Pin(_index & 0x7FFFFFFF); } if (typeof(T) == typeof(char) && _object is string value) { GCHandle handle = GCHandle.Alloc(value, GCHandleType.Pinned); void* pointer = System.Runtime.CompilerServices.Unsafe.Add<T>((void*)handle.AddrOfPinnedObject(), _index); return new MemoryHandle(pointer, handle); } if (_object is T[] array) { if (_length < 0) { void* pointer2 = System.Runtime.CompilerServices.Unsafe.Add<T>(System.Runtime.CompilerServices.Unsafe.AsPointer<T>(ref MemoryMarshal.GetReference<T>(array)), _index); return new MemoryHandle(pointer2); } GCHandle handle2 = GCHandle.Alloc(array, GCHandleType.Pinned); void* pointer3 = System.Runtime.CompilerServices.Unsafe.Add<T>((void*)handle2.AddrOfPinnedObject(), _index); return new MemoryHandle(pointer3, handle2); } return default(MemoryHandle); } public T[] ToArray() { return Span.ToArray(); } [EditorBrowsable(EditorBrowsableState.Never)] public override bool Equals(object obj) { if (obj is ReadOnlyMemory<T> readOnlyMemory) { return readOnlyMemory.Equals(this); } if (obj is Memory<T> other) { return Equals(other); } return false; } public bool Equals(Memory<T> other) { if (_object == other._object && _index == other._index) { return _length == other._length; } return false; } [EditorBrowsable(EditorBrowsableState.Never)] public override int GetHashCode() { if (_object == null) { return 0; } int hashCode = _object.GetHashCode(); int index = _index; int hashCode2 = index.GetHashCode(); index = _length; return CombineHashCodes(hashCode, hashCode2, index.GetHashCode()); } private static int CombineHashCodes(int left, int right) { return ((left << 5) + left) ^ right; } private static int CombineHashCodes(int h1, int h2, int h3) { return CombineHashCodes(CombineHashCodes(h1, h2), h3); } } internal sealed class MemoryDebugView<T> { private readonly ReadOnlyMemory<T> _memory; [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)] public T[] Items => _memory.ToArray(); public MemoryDebugView(Memory<T> memory) { _memory = memory; } public MemoryDebugView(ReadOnlyMemory<T> memory) { _memory = memory; } } public static class MemoryExtensions { internal static readonly IntPtr StringAdjustment = MeasureStringAdjustment(); public static ReadOnlySpan<char> Trim(this ReadOnlySpan<char> span) { return span.TrimStart().TrimEnd(); } public static ReadOnlySpan<char> TrimStart(this ReadOnlySpan<char> span) { int i; for (i = 0; i < span.Length && char.IsWhiteSpace(span[i]); i++) { } return span.Slice(i); } public static ReadOnlySpan<char> TrimEnd(this ReadOnlySpan<char> span) { int num = span.Length - 1; while (num >= 0 && char.IsWhiteSpace(span[num])) { num--; } return span.Slice(0, num + 1); } public static ReadOnlySpan<char> Trim(this ReadOnlySpan<char> span, char trimChar) { return span.TrimStart(trimChar).TrimEnd(trimChar); } public static ReadOnlySpan<char> TrimStart(this ReadOnlySpan<char> span, char trimChar) { int i; for (i = 0; i < span.Length && span[i] == trimChar; i++) { } return span.Slice(i); } public static ReadOnlySpan<char> TrimEnd(this ReadOnlySpan<char> span, char trimChar) { int num = span.Length - 1; while (num >= 0 && span[num] == trimChar) { num--; } return span.Slice(0, num + 1); } public static ReadOnlySpan<char> Trim(this ReadOnlySpan<char> span, ReadOnlySpan<char> trimChars) { return span.TrimStart(trimChars).TrimEnd(trimChars); } public static ReadOnlySpan<char> TrimStart(this ReadOnlySpan<char> span, ReadOnlySpan<char> trimChars) { if (trimChars.IsEmpty) { return span.TrimStart(); } int i; for (i = 0; i < span.Length; i++) { int num = 0; while (num < trimChars.Length) { if (span[i] != trimChars[num]) { num++; continue; } goto IL_003c; } break; IL_003c:; } return span.Slice(i); } public static ReadOnlySpan<char> TrimEnd(this ReadOnlySpan<char> span, ReadOnlySpan<char> trimChars) { if (trimChars.IsEmpty) { return span.TrimEnd(); } int num; for (num = span.Length - 1; num >= 0; num--) { int num2 = 0; while (num2 < trimChars.Length) { if (span[num] != trimChars[num2]) { num2++; continue; } goto IL_0044; } break; IL_0044:; } return span.Slice(0, num + 1); } public static bool IsWhiteSpace(this ReadOnlySpan<char> span) { for (int i = 0; i < span.Length; i++) { if (!char.IsWhiteSpace(span[i])) { return false; } } return true; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int IndexOf<T>(this Span<T> span, T value) where T : IEquatable<T> { if (typeof(T) == typeof(byte)) { return System.SpanHelpers.IndexOf(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)), System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref value), span.Length); } if (typeof(T) == typeof(char)) { return System.SpanHelpers.IndexOf(ref System.Runtime.CompilerServices.Unsafe.As<T, char>(ref MemoryMarshal.GetReference(span)), System.Runtime.CompilerServices.Unsafe.As<T, char>(ref value), span.Length); } return System.SpanHelpers.IndexOf(ref MemoryMarshal.GetReference(span), value, span.Length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int IndexOf<T>(this Span<T> span, ReadOnlySpan<T> value) where T : IEquatable<T> { if (typeof(T) == typeof(byte)) { return System.SpanHelpers.IndexOf(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)), span.Length, ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(value)), value.Length); } return System.SpanHelpers.IndexOf(ref MemoryMarshal.GetReference(span), span.Length, ref MemoryMarshal.GetReference(value), value.Length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int LastIndexOf<T>(this Span<T> span, T value) where T : IEquatable<T> { if (typeof(T) == typeof(byte)) { return System.SpanHelpers.LastIndexOf(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)), System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref value), span.Length); } if (typeof(T) == typeof(char)) { return System.SpanHelpers.LastIndexOf(ref System.Runtime.CompilerServices.Unsafe.As<T, char>(ref MemoryMarshal.GetReference(span)), System.Runtime.CompilerServices.Unsafe.As<T, char>(ref value), span.Length); } return System.SpanHelpers.LastIndexOf(ref MemoryMarshal.GetReference(span), value, span.Length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int LastIndexOf<T>(this Span<T> span, ReadOnlySpan<T> value) where T : IEquatable<T> { if (typeof(T) == typeof(byte)) { return System.SpanHelpers.LastIndexOf(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)), span.Length, ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(value)), value.Length); } return System.SpanHelpers.LastIndexOf(ref MemoryMarshal.GetReference(span), span.Length, ref MemoryMarshal.GetReference(value), value.Length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool SequenceEqual<T>(this Span<T> span, ReadOnlySpan<T> other) where T : IEquatable<T> { int length = span.Length; if (default(T) != null && IsTypeComparableAsBytes<T>(out var size)) { if (length == other.Length) { return System.SpanHelpers.SequenceEqual(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)), ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(other)), (NUInt)length * size); } return false; } if (length == other.Length) { return System.SpanHelpers.SequenceEqual(ref MemoryMarshal.GetReference(span), ref MemoryMarshal.GetReference(other), length); } return false; } public static int SequenceCompareTo<T>(this Span<T> span, ReadOnlySpan<T> other) where T : IComparable<T> { if (typeof(T) == typeof(byte)) { return System.SpanHelpers.SequenceCompareTo(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)), span.Length, ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(other)), other.Length); } if (typeof(T) == typeof(char)) { return System.SpanHelpers.SequenceCompareTo(ref System.Runtime.CompilerServices.Unsafe.As<T, char>(ref MemoryMarshal.GetReference(span)), span.Length, ref System.Runtime.CompilerServices.Unsafe.As<T, char>(ref MemoryMarshal.GetReference(other)), other.Length); } return System.SpanHelpers.SequenceCompareTo(ref MemoryMarshal.GetReference(span), span.Length, ref MemoryMarshal.GetReference(other), other.Length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int IndexOf<T>(this ReadOnlySpan<T> span, T value) where T : IEquatable<T> { if (typeof(T) == typeof(byte)) { return System.SpanHelpers.IndexOf(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)), System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref value), span.Length); } if (typeof(T) == typeof(char)) { return System.SpanHelpers.IndexOf(ref System.Runtime.CompilerServices.Unsafe.As<T, char>(ref MemoryMarshal.GetReference(span)), System.Runtime.CompilerServices.Unsafe.As<T, char>(ref value), span.Length); } return System.SpanHelpers.IndexOf(ref MemoryMarshal.GetReference(span), value, span.Length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int IndexOf<T>(this ReadOnlySpan<T> span, ReadOnlySpan<T> value) where T : IEquatable<T> { if (typeof(T) == typeof(byte)) { return System.SpanHelpers.IndexOf(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)), span.Length, ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(value)), value.Length); } return System.SpanHelpers.IndexOf(ref MemoryMarshal.GetReference(span), span.Length, ref MemoryMarshal.GetReference(value), value.Length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int LastIndexOf<T>(this ReadOnlySpan<T> span, T value) where T : IEquatable<T> { if (typeof(T) == typeof(byte)) { return System.SpanHelpers.LastIndexOf(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)), System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref value), span.Length); } if (typeof(T) == typeof(char)) { return System.SpanHelpers.LastIndexOf(ref System.Runtime.CompilerServices.Unsafe.As<T, char>(ref MemoryMarshal.GetReference(span)), System.Runtime.CompilerServices.Unsafe.As<T, char>(ref value), span.Length); } return System.SpanHelpers.LastIndexOf(ref MemoryMarshal.GetReference(span), value, span.Length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int LastIndexOf<T>(this ReadOnlySpan<T> span, ReadOnlySpan<T> value) where T : IEquatable<T> { if (typeof(T) == typeof(byte)) { return System.SpanHelpers.LastIndexOf(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)), span.Length, ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(value)), value.Length); } return System.SpanHelpers.LastIndexOf(ref MemoryMarshal.GetReference(span), span.Length, ref MemoryMarshal.GetReference(value), value.Length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int IndexOfAny<T>(this Span<T> span, T value0, T value1) where T : IEquatable<T> { if (typeof(T) == typeof(byte)) { return System.SpanHelpers.IndexOfAny(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)), System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref value0), System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref value1), span.Length); } return System.SpanHelpers.IndexOfAny(ref MemoryMarshal.GetReference(span), value0, value1, span.Length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int IndexOfAny<T>(this Span<T> span, T value0, T value1, T value2) where T : IEquatable<T> { if (typeof(T) == typeof(byte)) { return System.SpanHelpers.IndexOfAny(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)), System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref value0), System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref value1), System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref value2), span.Length); } return System.SpanHelpers.IndexOfAny(ref MemoryMarshal.GetReference(span), value0, value1, value2, span.Length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int IndexOfAny<T>(this Span<T> span, ReadOnlySpan<T> values) where T : IEquatable<T> { if (typeof(T) == typeof(byte)) { return System.SpanHelpers.IndexOfAny(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)), span.Length, ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(values)), values.Length); } return System.SpanHelpers.IndexOfAny(ref MemoryMarshal.GetReference(span), span.Length, ref MemoryMarshal.GetReference(values), values.Length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int IndexOfAny<T>(this ReadOnlySpan<T> span, T value0, T value1) where T : IEquatable<T> { if (typeof(T) == typeof(byte)) { return System.SpanHelpers.IndexOfAny(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)), System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref value0), System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref value1), span.Length); } return System.SpanHelpers.IndexOfAny(ref MemoryMarshal.GetReference(span), value0, value1, span.Length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int IndexOfAny<T>(this ReadOnlySpan<T> span, T value0, T value1, T value2) where T : IEquatable<T> { if (typeof(T) == typeof(byte)) { return System.SpanHelpers.IndexOfAny(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)), System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref value0), System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref value1), System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref value2), span.Length); } return System.SpanHelpers.IndexOfAny(ref MemoryMarshal.GetReference(span), value0, value1, value2, span.Length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int IndexOfAny<T>(this ReadOnlySpan<T> span, ReadOnlySpan<T> values) where T : IEquatable<T> { if (typeof(T) == typeof(byte)) { return System.SpanHelpers.IndexOfAny(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)), span.Length, ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(values)), values.Length); } return System.SpanHelpers.IndexOfAny(ref MemoryMarshal.GetReference(span), span.Length, ref MemoryMarshal.GetReference(values), values.Length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int LastIndexOfAny<T>(this Span<T> span, T value0, T value1) where T : IEquatable<T> { if (typeof(T) == typeof(byte)) { return System.SpanHelpers.LastIndexOfAny(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)), System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref value0), System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref value1), span.Length); } return System.SpanHelpers.LastIndexOfAny(ref MemoryMarshal.GetReference(span), value0, value1, span.Length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int LastIndexOfAny<T>(this Span<T> span, T value0, T value1, T value2) where T : IEquatable<T> { if (typeof(T) == typeof(byte)) { return System.SpanHelpers.LastIndexOfAny(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)), System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref value0), System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref value1), System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref value2), span.Length); } return System.SpanHelpers.LastIndexOfAny(ref MemoryMarshal.GetReference(span), value0, value1, value2, span.Length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int LastIndexOfAny<T>(this Span<T> span, ReadOnlySpan<T> values) where T : IEquatable<T> { if (typeof(T) == typeof(byte)) { return System.SpanHelpers.LastIndexOfAny(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)), span.Length, ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(values)), values.Length); } return System.SpanHelpers.LastIndexOfAny(ref MemoryMarshal.GetReference(span), span.Length, ref MemoryMarshal.GetReference(values), values.Length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int LastIndexOfAny<T>(this ReadOnlySpan<T> span, T value0, T value1) where T : IEquatable<T> { if (typeof(T) == typeof(byte)) { return System.SpanHelpers.LastIndexOfAny(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)), System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref value0), System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref value1), span.Length); } return System.SpanHelpers.LastIndexOfAny(ref MemoryMarshal.GetReference(span), value0, value1, span.Length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int LastIndexOfAny<T>(this ReadOnlySpan<T> span, T value0, T value1, T value2) where T : IEquatable<T> { if (typeof(T) == typeof(byte)) { return System.SpanHelpers.LastIndexOfAny(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)), System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref value0), System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref value1), System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref value2), span.Length); } return System.SpanHelpers.LastIndexOfAny(ref MemoryMarshal.GetReference(span), value0, value1, value2, span.Length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int LastIndexOfAny<T>(this ReadOnlySpan<T> span, ReadOnlySpan<T> values) where T : IEquatable<T> { if (typeof(T) == typeof(byte)) { return System.SpanHelpers.LastIndexOfAny(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)), span.Length, ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(values)), values.Length); } return System.SpanHelpers.LastIndexOfAny(ref MemoryMarshal.GetReference(span), span.Length, ref MemoryMarshal.GetReference(values), values.Length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool SequenceEqual<T>(this ReadOnlySpan<T> span, ReadOnlySpan<T> other) where T : IEquatable<T> { int length = span.Length; if (default(T) != null && IsTypeComparableAsBytes<T>(out var size)) { if (length == other.Length) { return System.SpanHelpers.SequenceEqual(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)), ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(other)), (NUInt)length * size); } return false; } if (length == other.Length) { return System.SpanHelpers.SequenceEqual(ref MemoryMarshal.GetReference(span), ref MemoryMarshal.GetReference(other), length); } return false; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int SequenceCompareTo<T>(this ReadOnlySpan<T> span, ReadOnlySpan<T> other) where T : IComparable<T> { if (typeof(T) == typeof(byte)) { return System.SpanHelpers.SequenceCompareTo(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)), span.Length, ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(other)), other.Length); } if (typeof(T) == typeof(char)) { return System.SpanHelpers.SequenceCompareTo(ref System.Runtime.CompilerServices.Unsafe.As<T, char>(ref MemoryMarshal.GetReference(span)), span.Length, ref System.Runtime.CompilerServices.Unsafe.As<T, char>(ref MemoryMarshal.GetReference(other)), other.Length); } return System.SpanHelpers.SequenceCompareTo(ref MemoryMarshal.GetReference(span), span.Length, ref MemoryMarshal.GetReference(other), other.Length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool StartsWith<T>(this Span<T> span, ReadOnlySpan<T> value) where T : IEquatable<T> { int length = value.Length; if (default(T) != null && IsTypeComparableAsBytes<T>(out var size)) { if (length <= span.Length) { return System.SpanHelpers.SequenceEqual(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)), ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(value)), (NUInt)length * size); } return false; } if (length <= span.Length) { return System.SpanHelpers.SequenceEqual(ref MemoryMarshal.GetReference(span), ref MemoryMarshal.GetReference(value), length); } return false; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool StartsWith<T>(this ReadOnlySpan<T> span, ReadOnlySpan<T> value) where T : IEquatable<T> { int length = value.Length; if (default(T) != null && IsTypeComparableAsBytes<T>(out var size)) { if (length <= span.Length) { return System.SpanHelpers.SequenceEqual(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)), ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(value)), (NUInt)length * size); } return false; } if (length <= span.Length) { return System.SpanHelpers.SequenceEqual(ref MemoryMarshal.GetReference(span), ref MemoryMarshal.GetReference(value), length); } return false; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool EndsWith<T>(this Span<T> span, ReadOnlySpan<T> value) where T : IEquatable<T> { int length = span.Length; int length2 = value.Length; if (default(T) != null && IsTypeComparableAsBytes<T>(out var size)) { if (length2 <= length) { return System.SpanHelpers.SequenceEqual(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref System.Runtime.CompilerServices.Unsafe.Add<T>(ref MemoryMarshal.GetReference(span), length - length2)), ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(value)), (NUInt)length2 * size); } return false; } if (length2 <= length) { return System.SpanHelpers.SequenceEqual(ref System.Runtime.CompilerServices.Unsafe.Add<T>(ref MemoryMarshal.GetReference(span), length - length2), ref MemoryMarshal.GetReference(value), length2); } return false; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool EndsWith<T>(this ReadOnlySpan<T> span, ReadOnlySpan<T> value) where T : IEquatable<T> { int length = span.Length; int length2 = value.Length; if (default(T) != null && IsTypeComparableAsBytes<T>(out var size)) { if (length2 <= length) { return System.SpanHelpers.SequenceEqual(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref System.Runtime.CompilerServices.Unsafe.Add<T>(ref MemoryMarshal.GetReference(span), length - length2)), ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(value)), (NUInt)length2 * size); } return false; } if (length2 <= length) { return System.SpanHelpers.SequenceEqual(ref System.Runtime.CompilerServices.Unsafe.Add<T>(ref MemoryMarshal.GetReference(span), length - length2), ref MemoryMarshal.GetReference(value), length2); } return false; } public static void Reverse<T>(this Span<T> span) { ref T reference = ref MemoryMarshal.GetReference(span); int num = 0; int num2 = span.Length - 1; while (num < num2) { T val = System.Runtime.CompilerServices.Unsafe.Add<T>(ref reference, num); System.Runtime.CompilerServices.Unsafe.Add<T>(ref reference, num) = System.Runtime.CompilerServices.Unsafe.Add<T>(ref reference, num2); System.Runtime.CompilerServices.Unsafe.Add<T>(ref reference, num2) = val; num++; num2--; } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Span<T> AsSpan<T>(this T[] array) { return new Span<T>(array); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Span<T> AsSpan<T>(this T[] array, int start, int length) { return new Span<T>(array, start, length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Span<T> AsSpan<T>(this ArraySegment<T> segment) { return new Span<T>(segment.Array, segment.Offset, segment.Count); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Span<T> AsSpan<T>(this ArraySegment<T> segment, int start) { if ((uint)start > segment.Count) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.start); } return new Span<T>(segment.Array, segment.Offset + start, segment.Count - start); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Span<T> AsSpan<T>(this ArraySegment<T> segment, int start, int length) { if ((uint)start > segment.Count) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.start); } if ((uint)length > segment.Count - start) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.length); } return new Span<T>(segment.Array, segment.Offset + start, length); } public static Memory<T> AsMemory<T>(this T[] array) { return new Memory<T>(array); } public static Memory<T> AsMemory<T>(this T[] array, int start) { return new Memory<T>(array, start); } public static Memory<T> AsMemory<T>(this T[] array, int start, int length) { return new Memory<T>(array, start, length); } public static Memory<T> AsMemory<T>(this ArraySegment<T> segment) { return new Memory<T>(segment.Array, segment.Offset, segment.Count); } public static Memory<T> AsMemory<T>(this ArraySegment<T> segment, int start) { if ((uint)start > segment.Count) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.start); } return new Memory<T>(segment.Array, segment.Offset + start, segment.Count - start); } public static Memory<T> AsMemory<T>(this ArraySegment<T> segment, int start, int length) { if ((uint)start > segment.Count) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.start); } if ((uint)length > segment.Count - start) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.length); } return new Memory<T>(segment.Array, segment.Offset + start, length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void CopyTo<T>(this T[] source, Span<T> destination) { new ReadOnlySpan<T>(source).CopyTo(destination); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void CopyTo<T>(this T[] source, Memory<T> destination) { source.CopyTo(destination.Span); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool Overlaps<T>(this Span<T> span, ReadOnlySpan<T> other) { return ((ReadOnlySpan<T>)span).Overlaps(other); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool Overlaps<T>(this Span<T> span, ReadOnlySpan<T> other, out int elementOffset) { return ((ReadOnlySpan<T>)span).Overlaps(other, out elementOffset); } public static bool Overlaps<T>(this ReadOnlySpan<T> span, ReadOnlySpan<T> other) { if (span.IsEmpty || other.IsEmpty) { return false; } IntPtr intPtr = System.Runtime.CompilerServices.Unsafe.ByteOffset<T>(ref MemoryMarshal.GetReference(span), ref MemoryMarshal.GetReference(other)); if (System.Runtime.CompilerServices.Unsafe.SizeOf<IntPtr>() == 4) { if ((uint)(int)intPtr >= (uint)(span.Length * System.Runtime.CompilerServices.Unsafe.SizeOf<T>())) { return (uint)(int)intPtr > (uint)(-(other.Length * System.Runtime.CompilerServices.Unsafe.SizeOf<T>())); } return true; } if ((ulong)(long)intPtr >= (ulong)((long)span.Length * (long)System.Runtime.CompilerServices.Unsafe.SizeOf<T>())) { return (ulong)(long)intPtr > (ulong)(-((long)other.Length * (long)System.Runtime.CompilerServices.Unsafe.SizeOf<T>())); } return true; } public static bool Overlaps<T>(this ReadOnlySpan<T> span, ReadOnlySpan<T> other, out int elementOffset) { if (span.IsEmpty || other.IsEmpty) { elementOffset = 0; return false; } IntPtr intPtr = System.Runtime.CompilerServices.Unsafe.ByteOffset<T>(ref MemoryMarshal.GetReference(span), ref MemoryMarshal.GetReference(other)); if (System.Runtime.CompilerServices.Unsafe.SizeOf<IntPtr>() == 4) { if ((uint)(int)intPtr < (uint)(span.Length * System.Runtime.CompilerServices.Unsafe.SizeOf<T>()) || (uint)(int)intPtr > (uint)(-(other.Length * System.Runtime.CompilerServices.Unsafe.SizeOf<T>()))) { if ((int)intPtr % System.Runtime.CompilerServices.Unsafe.SizeOf<T>() != 0) { System.ThrowHelper.ThrowArgumentException_OverlapAlignmentMismatch(); } elementOffset = (int)intPtr / System.Runtime.CompilerServices.Unsafe.SizeOf<T>(); return true; } elementOffset = 0; return false; } if ((ulong)(long)intPtr < (ulong)((long)span.Length * (long)System.Runtime.CompilerServices.Unsafe.SizeOf<T>()) || (ulong)(long)intPtr > (ulong)(-((long)other.Length * (long)System.Runtime.CompilerServices.Unsafe.SizeOf<T>()))) { if ((long)intPtr % System.Runtime.CompilerServices.Unsafe.SizeOf<T>() != 0L) { System.ThrowHelper.ThrowArgumentException_OverlapAlignmentMismatch(); } elementOffset = (int)((long)intPtr / System.Runtime.CompilerServices.Unsafe.SizeOf<T>()); return true; } elementOffset = 0; return false; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int BinarySearch<T>(this Span<T> span, IComparable<T> comparable) { return span.BinarySearch<T, IComparable<T>>(comparable); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int BinarySearch<T, TComparable>(this Span<T> span, TComparable comparable) where TComparable : IComparable<T> { return BinarySearch((ReadOnlySpan<T>)span, comparable); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int BinarySearch<T, TComparer>(this Span<T> span, T value, TComparer comparer) where TComparer : IComparer<T> { return ((ReadOnlySpan<T>)span).BinarySearch(value, comparer); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int BinarySearch<T>(this ReadOnlySpan<T> span, IComparable<T> comparable) { return MemoryExtensions.BinarySearch<T, IComparable<T>>(span, comparable); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int BinarySearch<T, TComparable>(this ReadOnlySpan<T> span, TComparable comparable) where TComparable : IComparable<T> { return System.SpanHelpers.BinarySearch(span, comparable); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int BinarySearch<T, TComparer>(this ReadOnlySpan<T> span, T value, TComparer comparer) where TComparer : IComparer<T> { if (comparer == null) { System.ThrowHelper.ThrowArgumentNullException(System.ExceptionArgument.comparer); } System.SpanHelpers.ComparerComparable<T, TComparer> comparable = new System.SpanHelpers.ComparerComparable<T, TComparer>(value, comparer); return BinarySearch(span, comparable); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static bool IsTypeComparableAsBytes<T>(out NUInt size) { if (typeof(T) == typeof(byte) || typeof(T) == typeof(sbyte)) { size = (NUInt)1; return true; } if (typeof(T) == typeof(char) || typeof(T) == typeof(short) || typeof(T) == typeof(ushort)) { size = (NUInt)2; return true; } if (typeof(T) == typeof(int) || typeof(T) == typeof(uint)) { size = (NUInt)4; return true; } if (typeof(T) == typeof(long) || typeof(T) == typeof(ulong)) { size = (NUInt)8; return true; } size = default(NUInt); return false; } public static Span<T> AsSpan<T>(this T[] array, int start) { return Span<T>.Create(array, start); } public static bool Contains(this ReadOnlySpan<char> span, ReadOnlySpan<char> value, StringComparison comparisonType) { return span.IndexOf(value, comparisonType) >= 0; } public static bool Equals(this ReadOnlySpan<char> span, ReadOnlySpan<char> other, StringComparison comparisonType) { switch (comparisonType) { case StringComparison.Ordinal: return span.SequenceEqual(other); case StringComparison.OrdinalIgnoreCase: if (span.Length != other.Length) { return false; } return EqualsOrdinalIgnoreCase(span, other); default: return span.ToString().Equals(other.ToString(), comparisonType); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static bool EqualsOrdinalIgnoreCase(ReadOnlySpan<char> span, ReadOnlySpan<char> other) { if (other.Length == 0) { return true; } return CompareToOrdinalIgnoreCase(span, other) == 0; } public static int CompareTo(this ReadOnlySpan<char> span, ReadOnlySpan<char> other, StringComparison comparisonType) { return comparisonType switch { StringComparison.Ordinal => span.SequenceCompareTo(other), StringComparison.OrdinalIgnoreCase => CompareToOrdinalIgnoreCase(span, other), _ => string.Compare(span.ToString(), other.ToString(), comparisonType), }; } private unsafe static int CompareToOrdinalIgnoreCase(ReadOnlySpan<char> strA, ReadOnlySpan<char> strB) { int num = Math.Min(strA.Length, strB.Length); int num2 = num; fixed (char* ptr = &MemoryMarshal.GetReference(strA)) { fixed (char* ptr3 = &MemoryMarshal.GetReference(strB)) { char* ptr2 = ptr; char* ptr4 = ptr3; while (num != 0 && *ptr2 <= '\u007f' && *ptr4 <= '\u007f') { int num3 = *ptr2; int num4 = *ptr4; if (num3 == num4) { ptr2++; ptr4++; num--; continue; } if ((uint)(num3 - 97) <= 25u) { num3 -= 32; } if ((uint)(num4 - 97) <= 25u) { num4 -= 32; } if (num3 != num4) { return num3 - num4; } ptr2++; ptr4++; num--; } if (num == 0) { return strA.Length - strB.Length; } num2 -= num; return string.Compare(strA.Slice(num2).ToString(), strB.Slice(num2).ToString(), StringComparison.OrdinalIgnoreCase); } } } public static int IndexOf(this ReadOnlySpan<char> span, ReadOnlySpan<char> value, StringComparison comparisonType) { if (comparisonType == StringComparison.Ordinal) { return span.IndexOf(value); } return span.ToString().IndexOf(value.ToString(), comparisonType); } public static int ToLower(this ReadOnlySpan<char> source, Span<char> destination, CultureInfo culture) { if (culture == null) { System.ThrowHelper.ThrowArgumentNullException(System.ExceptionArgument.culture); } if (destination.Length < source.Length) { return -1; } string text = source.ToString(); string text2 = text.ToLower(culture); AsSpan(text2).CopyTo(destination); return source.Length; } public static int ToLowerInvariant(this ReadOnlySpan<char> source, Span<char> destination) { return source.ToLower(destination, CultureInfo.InvariantCulture); } public static int ToUpper(this ReadOnlySpan<char> source, Span<char> destination, CultureInfo culture) { if (culture == null) { System.ThrowHelper.ThrowArgumentNullException(System.ExceptionArgument.culture); } if (destination.Length < source.Length) { return -1; } string text = source.ToString(); string text2 = text.ToUpper(culture); AsSpan(text2).CopyTo(destination); return source.Length; } public static int ToUpperInvariant(this ReadOnlySpan<char> source, Span<char> destination) { return source.ToUpper(destination, CultureInfo.InvariantCulture); } public static bool EndsWith(this ReadOnlySpan<char> span, ReadOnlySpan<char> value, StringComparison comparisonType) { switch (comparisonType) { case StringComparison.Ordinal: return span.EndsWith(value); case StringComparison.OrdinalIgnoreCase: if (value.Length <= span.Length) { return EqualsOrdinalIgnoreCase(span.Slice(span.Length - value.Length), value); } return false; default: { string text = span.ToString(); string value2 = value.ToString(); return text.EndsWith(value2, comparisonType); } } } public static bool StartsWith(this ReadOnlySpan<char> span, ReadOnlySpan<char> value, StringComparison comparisonType) { switch (comparisonType) { case StringComparison.Ordinal: return span.StartsWith(value); case StringComparison.OrdinalIgnoreCase: if (value.Length <= span.Length) { return EqualsOrdinalIgnoreCase(span.Slice(0, value.Length), value); } return false; default: { string text = span.ToString(); string value2 = value.ToString(); return text.StartsWith(value2, comparisonType); } } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ReadOnlySpan<char> AsSpan(this string text) { if (text == null) { return default(ReadOnlySpan<char>); } return new ReadOnlySpan<char>(System.Runtime.CompilerServices.Unsafe.As<Pinnable<char>>((object)text), StringAdjustment, text.Length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ReadOnlySpan<char> AsSpan(this string text, int start) { if (text == null) { if (start != 0) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.start); } return default(ReadOnlySpan<char>); } if ((uint)start > (uint)text.Length) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.start); } return new ReadOnlySpan<char>(System.Runtime.CompilerServices.Unsafe.As<Pinnable<char>>((object)text), StringAdjustment + start * 2, text.Length - start); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ReadOnlySpan<char> AsSpan(this string text, int start, int length) { if (text == null) { if (start != 0 || length != 0) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.start); } return default(ReadOnlySpan<char>); } if ((uint)start > (uint)text.Length || (uint)length > (uint)(text.Length - start)) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.start); } return new ReadOnlySpan<char>(System.Runtime.CompilerServices.Unsafe.As<Pinnable<char>>((object)text), StringAdjustment + start * 2, length); } public static ReadOnlyMemory<char> AsMemory(this string text) { if (text == null) { return default(ReadOnlyMemory<char>); } return new ReadOnlyMemory<char>(text, 0, text.Length); } public static ReadOnlyMemory<char> AsMemory(this string text, int start) { if (text == null) { if (start != 0) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.start); } return default(ReadOnlyMemory<char>); } if ((uint)start > (uint)text.Length) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.start); } return new ReadOnlyMemory<char>(text, start, text.Length - start); } public static ReadOnlyMemory<char> AsMemory(this string text, int start, int length) { if (text == null) { if (start != 0 || length != 0) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.start); } return default(ReadOnlyMemory<char>); } if ((uint)start > (uint)text.Length || (uint)length > (uint)(text.Length - start)) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.start); } return new ReadOnlyMemory<char>(text, start, length); } private unsafe static IntPtr MeasureStringAdjustment() { string text = "a"; fixed (char* ptr = text) { return System.Runtime.CompilerServices.Unsafe.ByteOffset<char>(ref System.Runtime.CompilerServices.Unsafe.As<Pinnable<char>>((object)text).Data, ref System.Runtime.CompilerServices.Unsafe.AsRef<char>((void*)ptr)); } } } [DebuggerTypeProxy(typeof(System.MemoryDebugView<>))] [DebuggerDisplay("{ToString(),raw}")] public readonly struct ReadOnlyMemory<T> { private readonly object _object; private readonly int _index; private readonly int _length; internal const int RemoveFlagsBitMask = int.MaxValue; public static ReadOnlyMemory<T> Empty => default(ReadOnlyMemory<T>); public int Length => _length & 0x7FFFFFFF; public bool IsEmpty => (_length & 0x7FFFFFFF) == 0; public ReadOnlySpan<T> Span { [MethodImpl(MethodImplOptions.AggressiveInlining)] get { if (_index < 0) { return ((MemoryManager<T>)_object).GetSpan().Slice(_index & 0x7FFFFFFF, _length); } ReadOnlySpan<T> result; if (typeof(T) == typeof(char) && _object is string text) { result = new ReadOnlySpan<T>(System.Runtime.CompilerServices.Unsafe.As<Pinnable<T>>((object)text), MemoryExtensions.StringAdjustment, text.Length); return result.Slice(_index, _length); } if (_object != null) { return new ReadOnlySpan<T>((T[])_object, _index, _length & 0x7FFFFFFF); } result = default(ReadOnlySpan<T>); return result; } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public ReadOnlyMemory(T[] array) { if (array == null) { this = default(ReadOnlyMemory<T>); return; } _object = array; _index = 0; _length = array.Length; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public ReadOnlyMemory(T[] array, int start, int length) { if (array == null) { if (start != 0 || length != 0) { System.ThrowHelper.ThrowArgumentOutOfRangeException(); } this = default(ReadOnlyMemory<T>); return; } if ((uint)start > (uint)array.Length || (uint)length > (uint)(array.Length - start)) { System.ThrowHelper.ThrowArgumentOutOfRangeException(); } _object = array; _index = start; _length = length; } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal ReadOnlyMemory(object obj, int start, int length) { _object = obj; _index = start; _length = length; } public static implicit operator ReadOnlyMemory<T>(T[] array) { return new ReadOnlyMemory<T>(array); } public static implicit operator ReadOnlyMemory<T>(ArraySegment<T> segment) { return new ReadOnlyMemory<T>(segment.Array, segment.Offset, segment.Count); } public override string ToString() { if (typeof(T) == typeof(char)) { if (!(_object is string text)) { return Span.ToString(); } return text.Substring(_index, _length & 0x7FFFFFFF); } return $"System.ReadOnlyMemory<{typeof(T).Name}>[{_length & 0x7FFFFFFF}]"; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public ReadOnlyMemory<T> Slice(int start) { int length = _length; int num = length & 0x7FFFFFFF; if ((uint)start > (uint)num) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.start); } return new ReadOnlyMemory<T>(_object, _index + start, length - start); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public ReadOnlyMemory<T> Slice(int start, int length) { int length2 = _length; int num = _length & 0x7FFFFFFF; if ((uint)start > (uint)num || (uint)length > (uint)(num - start)) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.start); } return new ReadOnlyMemory<T>(_object, _index + start, length | (length2 & int.MinValue)); } public void CopyTo(Memory<T> destination) { Span.CopyTo(destination.Span); } public bool TryCopyTo(Memory<T> destination) { return Span.TryCopyTo(destination.Span); } public unsafe MemoryHandle Pin() { if (_index < 0) { return ((MemoryManager<T>)_object).Pin(_index & 0x7FFFFFFF); } if (typeof(T) == typeof(char) && _object is string value) { GCHandle handle = GCHandle.Alloc(value, GCHandleType.Pinned); void* pointer = System.Runtime.CompilerServices.Unsafe.Add<T>((void*)handle.AddrOfPinnedObject(), _index); return new MemoryHandle(pointer, handle); } if (_object is T[] array) { if (_length < 0) { void* pointer2 = System.Runtime.CompilerServices.Unsafe.Add<T>(System.Runtime.CompilerServices.Unsafe.AsPointer<T>(ref MemoryMarshal.GetReference<T>(array)), _index); return new MemoryHandle(pointer2); } GCHandle handle2 = GCHandle.Alloc(array, GCHandleType.Pinned); void* pointer3 = System.Runtime.CompilerServices.Unsafe.Add<T>((void*)handle2.AddrOfPinnedObject(), _index); return new MemoryHandle(pointer3, handle2); } return default(MemoryHandle); } public T[] ToArray() { return Span.ToArray(); } [EditorBrowsable(EditorBrowsableState.Never)] public override bool Equals(object obj) { if (obj is ReadOnlyMemory<T> other) { return Equals(other); } if (obj is Memory<T> memory) { return Equals(memory); } return false; } public bool Equals(ReadOnlyMemory<T> other) { if (_object == other._object && _index == other._index) { return _length == other._length; } return false; } [EditorBrowsable(EditorBrowsableState.Never)] public override int GetHashCode() { if (_object == null) { return 0; } int hashCode = _object.GetHashCode(); int index = _index; int hashCode2 = index.GetHashCode(); index = _length; return CombineHashCodes(hashCode, hashCode2, index.GetHashCode()); } private static int CombineHashCodes(int left, int right) { return ((left << 5) + left) ^ right; } private static int CombineHashCodes(int h1, int h2, int h3) { return CombineHashCodes(CombineHashCodes(h1, h2), h3); } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal object GetObjectStartLength(out int start, out int length) { start = _index; length = _length; return _object; } } [DebuggerTypeProxy(typeof(System.SpanDebugView<>))] [DebuggerDisplay("{ToString(),raw}")] [DebuggerTypeProxy(typeof(System.SpanDebugView<>))] [DebuggerDisplay("{ToString(),raw}")] public readonly ref struct ReadOnlySpan<T> { public ref struct Enumerator { private readonly ReadOnlySpan<T> _span; private int _index; public ref readonly T Current { [MethodImpl(MethodImplOptions.AggressiveInlining)] get { return ref _span[_index]; } } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal Enumerator(ReadOnlySpan<T> span) { _span = span; _index = -1; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool MoveNext() { int num = _index + 1; if (num < _span.Length) { _index = num; return true; } return false; } } private readonly Pinnable<T> _pinnable; private readonly IntPtr _byteOffset; private readonly int _length; public int Length => _length; public bool IsEmpty => _length == 0; public static ReadOnlySpan<T> Empty => default(ReadOnlySpan<T>); public unsafe ref readonly T this[int index] { [MethodImpl(MethodImplOptions.AggressiveInlining)] get { if ((uint)index >= (uint)_length) { System.ThrowHelper.ThrowIndexOutOfRangeException(); } if (_pinnable == null) { IntPtr byteOffset = _byteOffset; return ref System.Runtime.CompilerServices.Unsafe.Add<T>(ref System.Runtime.CompilerServices.Unsafe.AsRef<T>(byteOffset.ToPointer()), index); } return ref System.Runtime.CompilerServices.Unsafe.Add<T>(ref System.Runtime.CompilerServices.Unsafe.AddByteOffset<T>(ref _pinnable.Data, _byteOffset), index); } } internal Pinnable<T> Pinnable => _pinnable; internal IntPtr ByteOffset => _byteOffset; public static bool operator !=(ReadOnlySpan<T> left, ReadOnlySpan<T> right) { return !(left == right); } [Obsolete("Equals() on ReadOnlySpan will always throw an exception. Use == instead.")] [EditorBrowsable(EditorBrowsableState.Never)] public override bool Equals(object obj) { throw new NotSupportedException(System.SR.NotSupported_CannotCallEqualsOnSpan); } [Obsolete("GetHashCode() on ReadOnlySpan will always throw an exception.")] [EditorBrowsable(EditorBrowsableState.Never)] public override int GetHashCode() { throw new NotSupportedException(System.SR.NotSupported_CannotCallGetHashCodeOnSpan); } public static implicit operator ReadOnlySpan<T>(T[] array) { return new ReadOnlySpan<T>(array); } public static implicit operator ReadOnlySpan<T>(ArraySegment<T> segment) { return new ReadOnlySpan<T>(segment.Array, segment.Offset, segment.Count); } public Enumerator GetEnumerator() { return new Enumerator(this); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public ReadOnlySpan(T[] array) { if (array == null) { this = default(ReadOnlySpan<T>); return; } _length = array.Length; _pinnable = System.Runtime.CompilerServices.Unsafe.As<Pinnable<T>>((object)array); _byteOffset = System.SpanHelpers.PerTypeValues<T>.ArrayAdjustment; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public ReadOnlySpan(T[] array, int start, int length) { if (array == null) { if (start != 0 || length != 0) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.start); } this = default(ReadOnlySpan<T>); return; } if ((uint)start > (uint)array.Length || (uint)length > (uint)(array.Length - start)) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.start); } _length = length; _pinnable = System.Runtime.CompilerServices.Unsafe.As<Pinnable<T>>((object)array); _byteOffset = System.SpanHelpers.PerTypeValues<T>.ArrayAdjustment.Add<T>(start); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [CLSCompliant(false)] public unsafe ReadOnlySpan(void* pointer, int length) { if (System.SpanHelpers.IsReferenceOrContainsReferences<T>()) { System.ThrowHelper.ThrowArgumentException_InvalidTypeWithPointersNotSupported(typeof(T)); } if (length < 0) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.start); } _length = length; _pinnable = null; _byteOffset = new IntPtr(pointer); } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal ReadOnlySpan(Pinnable<T> pinnable, IntPtr byteOffset, int length) { _length = length; _pinnable = pinnable; _byteOffset = byteOffset; } [EditorBrowsable(EditorBrowsableState.Never)] public unsafe ref readonly T GetPinnableReference() { if (_length != 0) { if (_pinnable == null) { IntPtr byteOffset = _byteOffset; return ref System.Runtime.CompilerServices.Unsafe.AsRef<T>(byteOffset.ToPointer()); } return ref System.Runtime.CompilerServices.Unsafe.AddByteOffset<T>(ref _pinnable.Data, _byteOffset); } return ref System.Runtime.CompilerServices.Unsafe.AsRef<T>((void*)null); } public void CopyTo(Span<T> destination) { if (!TryCopyTo(destination)) { System.ThrowHelper.ThrowArgumentException_DestinationTooShort(); } } public bool TryCopyTo(Span<T> destination) { int length = _length; int length2 = destination.Length; if (length == 0) { return true; } if ((uint)length > (uint)length2) { return false; } ref T src = ref DangerousGetPinnableReference(); System.SpanHelpers.CopyTo(ref destination.DangerousGetPinnableReference(), length2, ref src, length); return true; } public static bool operator ==(ReadOnlySpan<T> left, ReadOnlySpan<T> right) { if (left._length == right._length) { return System.Runtime.CompilerServices.Unsafe.AreSame<T>(ref left.DangerousGetPinnableReference(), ref right.DangerousGetPinnableReference()); } return false; } public unsafe override string ToString() { if (typeof(T) == typeof(char)) { if (_byteOffset == MemoryExtensions.StringAdjustment) { object obj = System.Runtime.CompilerServices.Unsafe.As<object>((object)_pinnable); if (obj is string text && _length == text.Length) { return text; } } fixed (char* value = &System.Runtime.CompilerServices.Unsafe.As<T, char>(ref DangerousGetPinnableReference())) { return new string(value, 0, _length); } } return $"System.ReadOnlySpan<{typeof(T).Name}>[{_length}]"; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public ReadOnlySpan<T> Slice(int start) { if ((uint)start > (uint)_length) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.start); } IntPtr byteOffset = _byteOffset.Add<T>(start); int length = _length - start; return new ReadOnlySpan<T>(_pinnable, byteOffset, length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public ReadOnlySpan<T> Slice(int start, int length) { if ((uint)start > (uint)_length || (uint)length > (uint)(_length - start)) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.start); } IntPtr byteOffset = _byteOffset.Add<T>(start); return new ReadOnlySpan<T>(_pinnable, byteOffset, length); } public T[] ToArray() { if (_length == 0) { return System.SpanHelpers.PerTypeValues<T>.EmptyArray; } T[] array = new T[_length]; CopyTo(array); return array; } [MethodImpl(MethodImplOptions.AggressiveInlining)] [EditorBrowsable(EditorBrowsableState.Never)] internal unsafe ref T DangerousGetPinnableReference() { if (_pinnable == null) { IntPtr byteOffset = _byteOffset; return ref System.Runtime.CompilerServices.Unsafe.AsRef<T>(byteOffset.ToPointer()); } return ref System.Runtime.CompilerServices.Unsafe.AddByteOffset<T>(ref _pinnable.Data, _byteOffset); } } [DebuggerTypeProxy(typeof(System.SpanDebugView<>))] [DebuggerDisplay("{ToString(),raw}")] [DebuggerTypeProxy(typeof(System.SpanDebugView<>))] [DebuggerDisplay("{ToString(),raw}")] public readonly ref struct Span<T> { public ref struct Enumerator { private readonly Span<T> _span; private int _index; public ref T Current { [MethodImpl(MethodImplOptions.AggressiveInlining)] get { return ref _span[_index]; } } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal Enumerator(Span<T> span) { _span = span; _index = -1; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool MoveNext() { int num = _index + 1; if (num < _span.Length) { _index = num; return true; } return false; } } private readonly Pinnable<T> _pinnable; private readonly IntPtr _byteOffset; private readonly int _length; public int Length => _length; public bool IsEmpty => _length == 0; public static Span<T> Empty => default(Span<T>); public unsafe ref T this[int index] { [MethodImpl(MethodImplOptions.AggressiveInlining)] get { if ((uint)index >= (uint)_length) { System.ThrowHelper.ThrowIndexOutOfRangeException(); } if (_pinnable == null) { IntPtr byteOffset = _byteOffset; return ref System.Runtime.CompilerServices.Unsafe.Add<T>(ref System.Runtime.CompilerServices.Unsafe.AsRef<T>(byteOffset.ToPointer()), index); } return ref System.Runtime.CompilerServices.Unsafe.Add<T>(ref System.Runtime.CompilerServices.Unsafe.AddByteOffset<T>(ref _pinnable.Data, _byteOffset), index); } } internal Pinnable<T> Pinnable => _pinnable; internal IntPtr ByteOffset => _byteOffset; public static bool operator !=(Span<T> left, Span<T> right) { return !(left == right); } [Obsolete("Equals() on Span will always throw an exception. Use == instead.")] [EditorBrowsable(EditorBrowsableState.Never)] public override bool Equals(object obj) { throw new NotSupportedException(System.SR.NotSupported_CannotCallEqualsOnSpan); } [Obsolete("GetHashCode() on Span will always throw an exception.")] [EditorBrowsable(EditorBrowsableState.Never)] public override int GetHashCode() { throw new NotSupportedException(System.SR.NotSupported_CannotCallGetHashCodeOnSpan); } public static implicit operator Span<T>(T[] array) { return new Span<T>(array); } public static implicit operator Span<T>(ArraySegment<T> segment) { return new Span<T>(segment.Array, segment.Offset, segment.Count); } public Enumerator GetEnumerator() { return new Enumerator(this); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public Span(T[] array) { if (array == null) { this = default(Span<T>); return; } if (default(T) == null && array.GetType() != typeof(T[])) { System.ThrowHelper.ThrowArrayTypeMismatchException(); } _length = array.Length; _pinnable = System.Runtime.CompilerServices.Unsafe.As<Pinnable<T>>((object)array); _byteOffset = System.SpanHelpers.PerTypeValues<T>.ArrayAdjustment; } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static Span<T> Create(T[] array, int start) { if (array == null) { if (start != 0) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.start); } return default(Span<T>); } if (default(T) == null && array.GetType() != typeof(T[])) { System.ThrowHelper.ThrowArrayTypeMismatchException(); } if ((uint)start > (uint)array.Length) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.start); } IntPtr byteOffset = System.SpanHelpers.PerTypeValues<T>.ArrayAdjustment.Add<T>(start); int length = array.Length - start; return new Span<T>(System.Runtime.CompilerServices.Unsafe.As<Pinnable<T>>((object)array), byteOffset, length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public Span(T[] array, int start, int length) { if (array == null) { if (start != 0 || length != 0) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.start); } this = default(Span<T>); return; } if (default(T) == null && array.GetType() != typeof(T[])) { System.ThrowHelper.ThrowArrayTypeMismatchException(); } if ((uint)start > (uint)array.Length || (uint)length > (uint)(array.Length - start)) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.start); } _length = length; _pinnable = System.Runtime.CompilerServices.Unsafe.As<Pinnable<T>>((object)array); _byteOffset = System.SpanHelpers.PerTypeValues<T>.ArrayAdjustment.Add<T>(start); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [CLSCompliant(false)] public unsafe Span(void* pointer, int length) { if (System.SpanHelpers.IsReferenceOrContainsReferences<T>()) { System.ThrowHelper.ThrowArgumentException_InvalidTypeWithPointersNotSupported(typeof(T)); } if (length < 0) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.start); } _length = length; _pinnable = null; _byteOffset = new IntPtr(pointer); } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal Span(Pinnable<T> pinnable, IntPtr byteOffset, int length) { _length = length; _pinnable = pinnable; _byteOffset = byteOffset; } [EditorBrowsable(EditorBrowsableState.Never)] public unsafe ref T GetPinnableReference() { if (_length != 0) { if (_pinnable == null) { IntPtr byteOffset = _byteOffset; return ref System.Runtime.CompilerServices.Unsafe.AsRef<T>(byteOffset.ToPointer()); } return ref System.Runtime.CompilerServices.Unsafe.AddByteOffset<T>(ref _pinnable.Data, _byteOffset); } return ref System.Runtime.CompilerServices.Unsafe.AsRef<T>((void*)null); } public unsafe void Clear() { int length = _length; if (length == 0) { return; } UIntPtr byteLength = (UIntPtr)(ulong)((uint)length * System.Runtime.CompilerServices.Unsafe.SizeOf<T>()); if ((System.Runtime.CompilerServices.Unsafe.SizeOf<T>() & (sizeof(IntPtr) - 1)) != 0) { if (_pinnable == null) { IntPtr byteOffset = _byteOffset; byte* ptr = (byte*)byteOffset.ToPointer(); System.SpanHelpers.ClearLessThanPointerSized(ptr, byteLength); } else { System.SpanHelpers.ClearLessThanPointerSized(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref System.Runtime.CompilerServices.Unsafe.AddByteOffset<T>(ref _pinnable.Data, _byteOffset)), byteLength); } } else if (System.SpanHelpers.IsReferenceOrContainsReferences<T>()) { UIntPtr pointerSizeLength = (UIntPtr)(ulong)(length * System.Runtime.CompilerServices.Unsafe.SizeOf<T>() / sizeof(IntPtr)); System.SpanHelpers.ClearPointerSizedWithReferences(ref System.Runtime.CompilerServices.Unsafe.As<T, IntPtr>(ref DangerousGetPinnableReference()), pointerSizeLength); } else { System.SpanHelpers.ClearPointerSizedWithoutReferences(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref DangerousGetPinnableReference()), byteLength); } } public unsafe void Fill(T value) { int length = _length; if (length == 0) { return; } if (System.Runtime.CompilerServices.Unsafe.SizeOf<T>() == 1) { byte b = System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref value); if (_pinnable == null) { IntPtr byteOffset = _byteOffset; System.Runtime.CompilerServices.Unsafe.InitBlockUnaligned(byteOffset.ToPointer(), b, (uint)length); } else { System.Runtime.CompilerServices.Unsafe.InitBlockUnaligned(ref System.Runtime.CompilerServices.Unsafe.As<T, byte>(ref System.Runtime.CompilerServices.Unsafe.AddByteOffset<T>(ref _pinnable.Data, _byteOffset)), b, (uint)length); } return; } ref T reference = ref DangerousGetPinnableReference(); int i; for (i = 0; i < (length & -8); i += 8) { System.Runtime.CompilerServices.Unsafe.Add<T>(ref reference, i) = value; System.Runtime.CompilerServices.Unsafe.Add<T>(ref reference, i + 1) = value; System.Runtime.CompilerServices.Unsafe.Add<T>(ref reference, i + 2) = value; System.Runtime.CompilerServices.Unsafe.Add<T>(ref reference, i + 3) = value; System.Runtime.CompilerServices.Unsafe.Add<T>(ref reference, i + 4) = value; System.Runtime.CompilerServices.Unsafe.Add<T>(ref reference, i + 5) = value; System.Runtime.CompilerServices.Unsafe.Add<T>(ref reference, i + 6) = value; System.Runtime.CompilerServices.Unsafe.Add<T>(ref reference, i + 7) = value; } if (i < (length & -4)) { System.Runtime.CompilerServices.Unsafe.Add<T>(ref reference, i) = value; System.Runtime.CompilerServices.Unsafe.Add<T>(ref reference, i + 1) = value; System.Runtime.CompilerServices.Unsafe.Add<T>(ref reference, i + 2) = value; System.Runtime.CompilerServices.Unsafe.Add<T>(ref reference, i + 3) = value; i += 4; } for (; i < length; i++) { System.Runtime.CompilerServices.Unsafe.Add<T>(ref reference, i) = value; } } public void CopyTo(Span<T> destination) { if (!TryCopyTo(destination)) { System.ThrowHelper.ThrowArgumentException_DestinationTooShort(); } } public bool TryCopyTo(Span<T> destination) { int length = _length; int length2 = destination._length; if (length == 0) { return true; } if ((uint)length > (uint)length2) { return false; } ref T src = ref DangerousGetPinnableReference(); System.SpanHelpers.CopyTo(ref destination.DangerousGetPinnableReference(), length2, ref src, length); return true; } public static bool operator ==(Span<T> left, Span<T> right) { if (left._length == right._length) { return System.Runtime.CompilerServices.Unsafe.AreSame<T>(ref left.DangerousGetPinnableReference(), ref right.DangerousGetPinnableReference()); } return false; } public static implicit operator ReadOnlySpan<T>(Span<T> span) { return new ReadOnlySpan<T>(span._pinnable, span._byteOffset, span._length); } public unsafe override string ToString() { if (typeof(T) == typeof(char)) { fixed (char* value = &System.Runtime.CompilerServices.Unsafe.As<T, char>(ref DangerousGetPinnableReference())) { return new string(value, 0, _length); } } return $"System.Span<{typeof(T).Name}>[{_length}]"; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public Span<T> Slice(int start) { if ((uint)start > (uint)_length) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.start); } IntPtr byteOffset = _byteOffset.Add<T>(start); int length = _length - start; return new Span<T>(_pinnable, byteOffset, length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public Span<T> Slice(int start, int length) { if ((uint)start > (uint)_length || (uint)length > (uint)(_length - start)) { System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument.start); } IntPtr byteOffset = _byteOffset.Add<T>(start); return new Span<T>(_pinnable, byteOffset, length); } public T[] ToArray() { if (_length == 0) { return System.SpanHelpers.PerTypeValues<T>.EmptyArray; } T[] array = new T[_length]; CopyTo(array); return array; } [MethodImpl(MethodImplOptions.AggressiveInlining)] [EditorBrowsable(EditorBrowsableState.Never)] internal unsafe ref T DangerousGetPinnableReference() { if (_pinnable == null) { IntPtr byteOffset = _byteOffset; return ref System.Runtime.CompilerServices.Unsafe.AsRef<T>(byteOffset.ToPointer()); } return ref System.Runtime.CompilerServices.Unsafe.AddByteOffset<T>(ref _pinnable.Data, _byteOffset); } } internal sealed class SpanDebugView<T> { private readonly T[] _array; [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)] public T[] Items => _array; public SpanDebugView(Span<T> span) { _array = span.ToArray(); } public SpanDebugView(ReadOnlySpan<T> span) { _array = span.ToArray(); } } internal static class SpanHelpers { internal struct ComparerComparable<T, TComparer> : IComparable<T> where TComparer : IComparer<T> { private readonly T _value; private readonly TComparer _comparer; public ComparerComparable(T value, TComparer comparer) { _value = value; _comparer = comparer; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public int CompareTo(T other) { return _comparer.Compare(_value, other); } } [StructLayout(LayoutKind.Sequential, Size = 64)] private struct Reg64 { } [StructLayout(LayoutKind.Sequential, Size = 32)] private struct Reg32 { } [StructLayout(LayoutKind.Sequential, Size = 16)] private struct Reg16 { } public static class PerTypeValues<T> { public static readonly bool IsReferenceOrContainsReferences = IsReferenceOrContainsReferencesCore(typeof(T)); public static readonly T[] EmptyArray = new T[0]; public static readonly IntPtr ArrayAdjustment = MeasureArrayAdjustment(); private static IntPtr MeasureArrayAdjustment() { T[] array = new T[1]; return System.Runtime.CompilerServices.Unsafe.ByteOffset<T>(ref System.Runtime.CompilerServices.Unsafe.As<Pinnable<T>>((object)array).Data, ref array[0]); } } private const ulong XorPowerOfTwoToHighByte = 283686952306184uL; private const ulong XorPowerOfTwoToHighChar = 4295098372uL; [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int BinarySearch<T, TComparable>(this ReadOnlySpan<T> span, TComparable comparable) where TComparable : IComparable<T> { if (comparable == null) { System.ThrowHelper.ThrowArgumentNullException(System.ExceptionArgument.comparable); } return BinarySearch(ref MemoryMarshal.GetReference(span), span.Length, comparable); } public static int BinarySearch<T, TComparable>(ref T spanStart, int length, TComparable comparable) where TComparable : IComparable<T> { int num = 0; int num2 = length - 1; while (num <= num2) { int num3 = num2 + num >>> 1; int num4 = comparable.CompareTo(System.Runtime.CompilerServices.Unsafe.Add<T>(ref spanStart, num3)); if (num4 == 0) { return num3; } if (num4 > 0) { num = num3 + 1; } else { num2 = num3 - 1; } } return ~num; } public static int IndexOf(ref byte searchSpace, int searchSpaceLength, ref byte value, int valueLength) { if (valueLength == 0) { return 0; } byte value2 = value; ref byte second = ref System.Runtime.CompilerServices.Unsafe.Add<byte>(ref value, 1); int num = valueLength - 1; int num2 = 0; while (true) { int num3 = searchSpaceLength - num2 - num; if (num3 <= 0) { break; } int num4 = IndexOf(ref System.Runtime.CompilerServices.Unsafe.Add<byte>(ref searchSpace, num2), value2, num3); if (num4 == -1) { break; } num2 += num4; if (SequenceEqual(ref System.Runtime.CompilerServices.Unsafe.Add<byte>(ref searchSpace, num2 + 1), ref second, num)) { return num2; } num2++; } return -1; } public static int IndexOfAny(ref byte searchSpace, int searchSpaceLength, ref byte value, int valueLength) { if (valueLength == 0) { return 0; } int num = -1; for (int i = 0; i < valueLength; i++) { int num2 = IndexOf(ref searchSpace, System.Runtime.CompilerServices.Unsafe.Add<byte>(ref value, i), searchSpaceLength); if ((uint)num2 < (uint)num) { num = num2; searchSpaceLength = num2; if (num == 0) { break;
plugins/System.Runtime.CompilerServices.Unsafe.dll
Decompiled 16 hours agousing System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using Microsoft.CodeAnalysis; [assembly: AssemblyProduct("Microsoft® .NET Framework")] [assembly: CLSCompliant(false)] [assembly: AssemblyMetadata(".NETFrameworkAssembly", "")] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: CompilationRelaxations(8)] [assembly: AssemblyDescription("System.Runtime.CompilerServices.Unsafe")] [assembly: AssemblyFileVersion("6.0.21.52210")] [assembly: AssemblyInformationalVersion("6.0.0")] [assembly: AssemblyTitle("System.Runtime.CompilerServices.Unsafe")] [assembly: AssemblyMetadata("Serviceable", "True")] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: AssemblyMetadata("IsTrimmable", "True")] [assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")] [assembly: AssemblyCompany("Microsoft Corporation")] [assembly: AssemblyVersion("6.0.0.0")] namespace System.Runtime.CompilerServices { public static class Unsafe { [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public unsafe static T Read<T>(void* source) { return Unsafe.Read<T>(source); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public unsafe static T ReadUnaligned<T>(void* source) { return Unsafe.ReadUnaligned<T>(source); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public static T ReadUnaligned<T>(ref byte source) { return Unsafe.ReadUnaligned<T>(ref source); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public unsafe static void Write<T>(void* destination, T value) { Unsafe.Write(destination, value); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public unsafe static void WriteUnaligned<T>(void* destination, T value) { Unsafe.WriteUnaligned(destination, value); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public static void WriteUnaligned<T>(ref byte destination, T value) { Unsafe.WriteUnaligned(ref destination, value); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public unsafe static void Copy<T>(void* destination, ref T source) { Unsafe.Write(destination, source); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public unsafe static void Copy<T>(ref T destination, void* source) { destination = Unsafe.Read<T>(source); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public unsafe static void* AsPointer<T>(ref T value) { return Unsafe.AsPointer(ref value); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public static void SkipInit<T>(out T value) { } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public static int SizeOf<T>() { return Unsafe.SizeOf<T>(); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public unsafe static void CopyBlock(void* destination, void* source, uint byteCount) { // IL cpblk instruction Unsafe.CopyBlock(destination, source, byteCount); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public static void CopyBlock(ref byte destination, ref byte source, uint byteCount) { // IL cpblk instruction Unsafe.CopyBlock(ref destination, ref source, byteCount); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public unsafe static void CopyBlockUnaligned(void* destination, void* source, uint byteCount) { // IL cpblk instruction Unsafe.CopyBlockUnaligned(destination, source, byteCount); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public static void CopyBlockUnaligned(ref byte destination, ref byte source, uint byteCount) { // IL cpblk instruction Unsafe.CopyBlockUnaligned(ref destination, ref source, byteCount); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public unsafe static void InitBlock(void* startAddress, byte value, uint byteCount) { // IL initblk instruction Unsafe.InitBlock(startAddress, value, byteCount); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public static void InitBlock(ref byte startAddress, byte value, uint byteCount) { // IL initblk instruction Unsafe.InitBlock(ref startAddress, value, byteCount); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public unsafe static void InitBlockUnaligned(void* startAddress, byte value, uint byteCount) { // IL initblk instruction Unsafe.InitBlockUnaligned(startAddress, value, byteCount); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public static void InitBlockUnaligned(ref byte startAddress, byte value, uint byteCount) { // IL initblk instruction Unsafe.InitBlockUnaligned(ref startAddress, value, byteCount); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public static T As<T>(object o) where T : class { return (T)o; } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public unsafe static ref T AsRef<T>(void* source) { return ref *(T*)source; } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public static ref T AsRef<T>(in T source) { return ref source; } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public static ref TTo As<TFrom, TTo>(ref TFrom source) { return ref Unsafe.As<TFrom, TTo>(ref source); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public static ref T Unbox<T>(object box) where T : struct { return ref (T)box; } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public static ref T Add<T>(ref T source, int elementOffset) { return ref Unsafe.Add(ref source, elementOffset); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public unsafe static void* Add<T>(void* source, int elementOffset) { return (byte*)source + (nint)elementOffset * (nint)Unsafe.SizeOf<T>(); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public static ref T Add<T>(ref T source, IntPtr elementOffset) { return ref Unsafe.Add(ref source, elementOffset); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ref T Add<T>(ref T source, [System.Runtime.Versioning.NonVersionable] nuint elementOffset) { return ref Unsafe.Add(ref source, elementOffset); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public static ref T AddByteOffset<T>(ref T source, IntPtr byteOffset) { return ref Unsafe.AddByteOffset(ref source, byteOffset); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ref T AddByteOffset<T>(ref T source, [System.Runtime.Versioning.NonVersionable] nuint byteOffset) { return ref Unsafe.AddByteOffset(ref source, byteOffset); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public static ref T Subtract<T>(ref T source, int elementOffset) { return ref Unsafe.Subtract(ref source, elementOffset); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public unsafe static void* Subtract<T>(void* source, int elementOffset) { return (byte*)source - (nint)elementOffset * (nint)Unsafe.SizeOf<T>(); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public static ref T Subtract<T>(ref T source, IntPtr elementOffset) { return ref Unsafe.Subtract(ref source, elementOffset); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ref T Subtract<T>(ref T source, [System.Runtime.Versioning.NonVersionable] nuint elementOffset) { return ref Unsafe.Subtract(ref source, elementOffset); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public static ref T SubtractByteOffset<T>(ref T source, IntPtr byteOffset) { return ref Unsafe.SubtractByteOffset(ref source, byteOffset); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ref T SubtractByteOffset<T>(ref T source, [System.Runtime.Versioning.NonVersionable] nuint byteOffset) { return ref Unsafe.SubtractByteOffset(ref source, byteOffset); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public static IntPtr ByteOffset<T>(ref T origin, ref T target) { return Unsafe.ByteOffset(target: ref target, origin: ref origin); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public static bool AreSame<T>(ref T left, ref T right) { return Unsafe.AreSame(ref left, ref right); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public static bool IsAddressGreaterThan<T>(ref T left, ref T right) { return Unsafe.IsAddressGreaterThan(ref left, ref right); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public static bool IsAddressLessThan<T>(ref T left, ref T right) { return Unsafe.IsAddressLessThan(ref left, ref right); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public unsafe static bool IsNullRef<T>(ref T source) { return Unsafe.AsPointer(ref source) == null; } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public unsafe static ref T NullRef<T>() { return ref *(T*)null; } } } namespace System.Runtime.Versioning { [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Constructor | AttributeTargets.Method, AllowMultiple = false, Inherited = false)] internal sealed class NonVersionableAttribute : Attribute { } } namespace System.Runtime.CompilerServices { internal sealed class IsReadOnlyAttribute : Attribute { } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] [Microsoft.CodeAnalysis.Embedded] [CompilerGenerated] internal sealed class NativeIntegerAttribute : Attribute { public readonly bool[] TransformFlags; public NativeIntegerAttribute() { TransformFlags = new bool[1] { true }; } public NativeIntegerAttribute(bool[] A_0) { TransformFlags = A_0; } } } namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } }
plugins/System.Threading.Tasks.Extensions.dll
Decompiled 16 hours agousing System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Security; using System.Threading.Tasks; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("System.Threading.Tasks.Extensions")] [assembly: AssemblyDescription("System.Threading.Tasks.Extensions")] [assembly: AssemblyDefaultAlias("System.Threading.Tasks.Extensions")] [assembly: AssemblyCompany("Microsoft Corporation")] [assembly: AssemblyProduct("Microsoft® .NET Framework")] [assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")] [assembly: AssemblyFileVersion("4.6.25519.03")] [assembly: AssemblyInformationalVersion("4.6.25519.03 built by: dlab-DDVSOWINAGE013. Commit Hash: 8321c729934c0f8be754953439b88e6e1c120c24")] [assembly: CLSCompliant(true)] [assembly: AssemblyMetadata(".NETFrameworkAssembly", "")] [assembly: AssemblyMetadata("Serviceable", "True")] [assembly: AssemblyMetadata("PreferInbox", "True")] [assembly: AssemblyVersion("4.1.1.0")] namespace System.Threading.Tasks { [StructLayout(LayoutKind.Auto)] [AsyncMethodBuilder(typeof(AsyncValueTaskMethodBuilder<>))] public struct ValueTask<TResult> : IEquatable<ValueTask<TResult>> { internal readonly Task<TResult> _task; internal readonly TResult _result; public bool IsCompleted { get { if (_task != null) { return _task.IsCompleted; } return true; } } public bool IsCompletedSuccessfully { get { if (_task != null) { return _task.Status == TaskStatus.RanToCompletion; } return true; } } public bool IsFaulted { get { if (_task != null) { return _task.IsFaulted; } return false; } } public bool IsCanceled { get { if (_task != null) { return _task.IsCanceled; } return false; } } public TResult Result { get { if (_task != null) { return _task.GetAwaiter().GetResult(); } return _result; } } public ValueTask(TResult result) { _task = null; _result = result; } public ValueTask(Task<TResult> task) { if (task == null) { throw new ArgumentNullException("task"); } _task = task; _result = default(TResult); } public override int GetHashCode() { if (_task == null) { if (_result == null) { return 0; } return _result.GetHashCode(); } return _task.GetHashCode(); } public override bool Equals(object obj) { if (obj is ValueTask<TResult>) { return Equals((ValueTask<TResult>)obj); } return false; } public bool Equals(ValueTask<TResult> other) { if (_task == null && other._task == null) { return EqualityComparer<TResult>.Default.Equals(_result, other._result); } return _task == other._task; } public static bool operator ==(ValueTask<TResult> left, ValueTask<TResult> right) { return left.Equals(right); } public static bool operator !=(ValueTask<TResult> left, ValueTask<TResult> right) { return !left.Equals(right); } public Task<TResult> AsTask() { return _task ?? Task.FromResult(_result); } public ValueTaskAwaiter<TResult> GetAwaiter() { return new ValueTaskAwaiter<TResult>(this); } public ConfiguredValueTaskAwaitable<TResult> ConfigureAwait(bool continueOnCapturedContext) { return new ConfiguredValueTaskAwaitable<TResult>(this, continueOnCapturedContext); } public override string ToString() { if (_task != null) { if (_task.Status != TaskStatus.RanToCompletion || _task.Result == null) { return string.Empty; } return _task.Result.ToString(); } if (_result == null) { return string.Empty; } return _result.ToString(); } [EditorBrowsable(EditorBrowsableState.Never)] public static AsyncValueTaskMethodBuilder<TResult> CreateAsyncMethodBuilder() { return AsyncValueTaskMethodBuilder<TResult>.Create(); } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Interface | AttributeTargets.Delegate, Inherited = false, AllowMultiple = false)] public sealed class AsyncMethodBuilderAttribute : Attribute { public Type BuilderType { get; } public AsyncMethodBuilderAttribute(Type builderType) { BuilderType = builderType; } } [StructLayout(LayoutKind.Auto)] public struct AsyncValueTaskMethodBuilder<TResult> { private AsyncTaskMethodBuilder<TResult> _methodBuilder; private TResult _result; private bool _haveResult; private bool _useBuilder; public ValueTask<TResult> Task { get { if (_haveResult) { return new ValueTask<TResult>(_result); } _useBuilder = true; return new ValueTask<TResult>(_methodBuilder.Task); } } public static AsyncValueTaskMethodBuilder<TResult> Create() { return new AsyncValueTaskMethodBuilder<TResult> { _methodBuilder = AsyncTaskMethodBuilder<TResult>.Create() }; } public void Start<TStateMachine>(ref TStateMachine stateMachine) where TStateMachine : IAsyncStateMachine { _methodBuilder.Start(ref stateMachine); } public void SetStateMachine(IAsyncStateMachine stateMachine) { _methodBuilder.SetStateMachine(stateMachine); } public void SetResult(TResult result) { if (_useBuilder) { _methodBuilder.SetResult(result); return; } _result = result; _haveResult = true; } public void SetException(Exception exception) { _methodBuilder.SetException(exception); } public void AwaitOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : INotifyCompletion where TStateMachine : IAsyncStateMachine { _useBuilder = true; _methodBuilder.AwaitOnCompleted(ref awaiter, ref stateMachine); } [SecuritySafeCritical] public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : ICriticalNotifyCompletion where TStateMachine : IAsyncStateMachine { _useBuilder = true; _methodBuilder.AwaitUnsafeOnCompleted(ref awaiter, ref stateMachine); } } [StructLayout(LayoutKind.Auto)] public struct ConfiguredValueTaskAwaitable<TResult> { [StructLayout(LayoutKind.Auto)] public struct ConfiguredValueTaskAwaiter : ICriticalNotifyCompletion, INotifyCompletion { private readonly ValueTask<TResult> _value; private readonly bool _continueOnCapturedContext; public bool IsCompleted => _value.IsCompleted; internal ConfiguredValueTaskAwaiter(ValueTask<TResult> value, bool continueOnCapturedContext) { _value = value; _continueOnCapturedContext = continueOnCapturedContext; } public TResult GetResult() { if (_value._task != null) { return _value._task.GetAwaiter().GetResult(); } return _value._result; } public void OnCompleted(Action continuation) { _value.AsTask().ConfigureAwait(_continueOnCapturedContext).GetAwaiter() .OnCompleted(continuation); } public void UnsafeOnCompleted(Action continuation) { _value.AsTask().ConfigureAwait(_continueOnCapturedContext).GetAwaiter() .UnsafeOnCompleted(continuation); } } private readonly ValueTask<TResult> _value; private readonly bool _continueOnCapturedContext; internal ConfiguredValueTaskAwaitable(ValueTask<TResult> value, bool continueOnCapturedContext) { _value = value; _continueOnCapturedContext = continueOnCapturedContext; } public ConfiguredValueTaskAwaiter GetAwaiter() { return new ConfiguredValueTaskAwaiter(_value, _continueOnCapturedContext); } } public struct ValueTaskAwaiter<TResult> : ICriticalNotifyCompletion, INotifyCompletion { private readonly ValueTask<TResult> _value; public bool IsCompleted => _value.IsCompleted; internal ValueTaskAwaiter(ValueTask<TResult> value) { _value = value; } public TResult GetResult() { if (_value._task != null) { return _value._task.GetAwaiter().GetResult(); } return _value._result; } public void OnCompleted(Action continuation) { _value.AsTask().ConfigureAwait(continueOnCapturedContext: true).GetAwaiter() .OnCompleted(continuation); } public void UnsafeOnCompleted(Action continuation) { _value.AsTask().ConfigureAwait(continueOnCapturedContext: true).GetAwaiter() .UnsafeOnCompleted(continuation); } } [AttributeUsage(AttributeTargets.All)] internal class __BlockReflectionAttribute : Attribute { } }