From e5cad2eddeacba618826c060b018f12600e404c3 Mon Sep 17 00:00:00 2001
From: goat <16760685+goaaats@users.noreply.github.com>
Date: Sat, 28 Aug 2021 18:41:59 +0200
Subject: [PATCH] fix: unsafe implementation of SeString.Parse()
---
.../Text/SeStringHandling/SeStringManager.cs | 36 +++++++++++++------
1 file changed, 25 insertions(+), 11 deletions(-)
diff --git a/Dalamud/Game/Text/SeStringHandling/SeStringManager.cs b/Dalamud/Game/Text/SeStringHandling/SeStringManager.cs
index 958a2b493..ee856f708 100644
--- a/Dalamud/Game/Text/SeStringHandling/SeStringManager.cs
+++ b/Dalamud/Game/Text/SeStringHandling/SeStringManager.cs
@@ -28,23 +28,17 @@ namespace Dalamud.Game.Text.SeStringHandling
///
/// Parse a binary game message into an SeString.
///
- /// Binary message payload data in SE's internal format.
+ /// Pointer to the string's data in memory.
+ /// Length of the string's data in memory.
/// An SeString containing parsed Payload objects for each payload in the data.
- public SeString Parse(ReadOnlySpan data) => this.Parse(data.ToArray());
-
- ///
- /// Parse a binary game message into an SeString.
- ///
- /// Binary message payload data in SE's internal format.
- /// An SeString containing parsed Payload objects for each payload in the data.
- public SeString Parse(byte[] bytes)
+ public unsafe SeString Parse(byte* ptr, int len)
{
var payloads = new List();
- using (var stream = new MemoryStream(bytes))
+ using (var stream = new UnmanagedMemoryStream(ptr, len))
using (var reader = new BinaryReader(stream))
{
- while (stream.Position < bytes.Length)
+ while (stream.Position < len)
{
var payload = Payload.Decode(reader);
if (payload != null)
@@ -55,6 +49,26 @@ namespace Dalamud.Game.Text.SeStringHandling
return new SeString(payloads);
}
+ ///
+ /// Parse a binary game message into an SeString.
+ ///
+ /// Binary message payload data in SE's internal format.
+ /// An SeString containing parsed Payload objects for each payload in the data.
+ public unsafe SeString Parse(ReadOnlySpan data)
+ {
+ fixed (byte* ptr = data)
+ {
+ return this.Parse(ptr, data.Length);
+ }
+ }
+
+ ///
+ /// Parse a binary game message into an SeString.
+ ///
+ /// Binary message payload data in SE's internal format.
+ /// An SeString containing parsed Payload objects for each payload in the data.
+ public SeString Parse(byte[] bytes) => this.Parse(new ReadOnlySpan(bytes));
+
///
/// Creates an SeString representing an entire Payload chain that can be used to link an item in the chat log.
///