Browse Source

Add: string.byte

AnnulusGames 1 year ago
parent
commit
f0105bc26a

+ 1 - 0
src/Lua/Standard/OpenLibExtensions.cs

@@ -77,6 +77,7 @@ public static class OpenLibExtensions
     ];
     ];
 
 
     static readonly LuaFunction[] stringFunctions = [
     static readonly LuaFunction[] stringFunctions = [
+        ByteFunction.Instance,
         LenFunction.Instance,
         LenFunction.Instance,
         LowerFunction.Instance,
         LowerFunction.Instance,
         RepFunction.Instance,
         RepFunction.Instance,

+ 30 - 0
src/Lua/Standard/Text/ByteFunction.cs

@@ -0,0 +1,30 @@
+
+namespace Lua.Standard.Text;
+
+public sealed class ByteFunction : LuaFunction
+{
+    public override string Name => "byte";
+    public static readonly ByteFunction Instance = new();
+
+    protected override ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
+    {
+        var s = context.GetArgument<string>(0);
+        var i = context.HasArgument(1)
+            ? context.GetArgument<double>(1)
+            : 1;
+        var j = context.HasArgument(2)
+            ? context.GetArgument<double>(2)
+            : i;
+
+        LuaRuntimeException.ThrowBadArgumentIfNumberIsNotInteger(context.State, this, 2, i);
+        LuaRuntimeException.ThrowBadArgumentIfNumberIsNotInteger(context.State, this, 3, j);
+
+        var span = StringHelper.Slice(s, (int)i, (int)j);
+        for (int k = 0; k < span.Length; k++)
+        {
+            buffer.Span[k] = span[k];
+        }
+
+        return new(span.Length);
+    }
+}

+ 2 - 2
src/Lua/Standard/Text/StringHelper.cs

@@ -11,7 +11,7 @@ internal static class StringHelper
     }
     }
 
 
     [MethodImpl(MethodImplOptions.AggressiveInlining)]
     [MethodImpl(MethodImplOptions.AggressiveInlining)]
-    public static string SubString(string s, int i, int j)
+    public static ReadOnlySpan<char> Slice(string s, int i, int j)
     {
     {
         if (i < 0) i = s.Length + i + 1;
         if (i < 0) i = s.Length + i + 1;
         if (j < 0) i = s.Length + i + 1;
         if (j < 0) i = s.Length + i + 1;
@@ -19,6 +19,6 @@ internal static class StringHelper
         if (i < 1) i = 1;
         if (i < 1) i = 1;
         if (j > s.Length) j = s.Length;
         if (j > s.Length) j = s.Length;
 
 
-        return i > j ? "" : s.Substring(i - 1, j - 1);
+        return i > j ? "" : s.AsSpan().Slice(i - 1, j - 1);
     }
     }
 }
 }

+ 5 - 7
src/Lua/Standard/Text/SubFunction.cs

@@ -11,17 +11,15 @@ public sealed class SubFunction : LuaFunction
     protected override ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
     protected override ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
     {
     {
         var s = context.GetArgument<string>(0);
         var s = context.GetArgument<string>(0);
-        var i_arg = context.GetArgument<double>(1);
-        var j_arg = context.HasArgument(2)
+        var i = context.GetArgument<double>(1);
+        var j = context.HasArgument(2)
             ? context.GetArgument<double>(2)
             ? context.GetArgument<double>(2)
             : -1;
             : -1;
 
 
-        LuaRuntimeException.ThrowBadArgumentIfNumberIsNotInteger(context.State, this, 2, i_arg);
-        LuaRuntimeException.ThrowBadArgumentIfNumberIsNotInteger(context.State, this, 3, j_arg);
+        LuaRuntimeException.ThrowBadArgumentIfNumberIsNotInteger(context.State, this, 2, i);
+        LuaRuntimeException.ThrowBadArgumentIfNumberIsNotInteger(context.State, this, 3, j);
 
 
-        var i = (int)i_arg;
-        var j = (int)j_arg;
-        buffer.Span[0] = StringHelper.SubString(s, i, j);
+        buffer.Span[0] = StringHelper.Slice(s, (int)i, (int)j).ToString();
         return new(1);
         return new(1);
     }
     }
 }
 }