Browse Source

Add: io.type

AnnulusGames 1 year ago
parent
commit
73b05b59c1

+ 6 - 0
src/Lua/Standard/IO/FileHandle.cs

@@ -33,6 +33,9 @@ public class FileHandle : LuaUserData
 
     Stream stream;
     StreamReader? reader;
+    bool isClosed;
+
+    public bool IsClosed => Volatile.Read(ref isClosed);
 
     static readonly LuaTable fileHandleMetatable;
 
@@ -76,6 +79,9 @@ public class FileHandle : LuaUserData
 
     public void Close()
     {
+        if (isClosed) throw new ObjectDisposedException(nameof(FileHandle));
+        Volatile.Write(ref isClosed, true);
+
         if (reader != null)
         {
             reader.Dispose();

+ 23 - 0
src/Lua/Standard/IO/TypeFunction.cs

@@ -0,0 +1,23 @@
+namespace Lua.Standard.IO;
+
+public sealed class TypeFunction : LuaFunction
+{
+    public override string Name => "type";
+    public static readonly TypeFunction Instance = new();
+
+    protected override ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
+    {
+        var arg0 = context.ReadArgument(0);
+
+        if (arg0.TryRead<FileHandle>(out var file))
+        {
+            buffer.Span[0] = file.IsClosed ? "closed file" : "file";
+        }
+        else
+        {
+            buffer.Span[0] = LuaValue.Nil;
+        }
+
+        return new(1);
+    }
+}

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

@@ -25,7 +25,7 @@ public static class OpenLibExtensions
         NextFunction.Instance,
         IPairsFunction.Instance,
         PairsFunction.Instance,
-        TypeFunction.Instance,
+        Basic.TypeFunction.Instance,
         PCallFunction.Instance,
         XPCallFunction.Instance,
         DoFileFunction.Instance,
@@ -80,6 +80,7 @@ public static class OpenLibExtensions
         OutputFunction.Instance,
         WriteFunction.Instance,
         ReadFunction.Instance,
+        IO.TypeFunction.Instance,
     ];
 
     public static void OpenBasicLibrary(this LuaState state)