Browse Source

Merge pull request #21 from AnnulusGames/require-standard

Add: LuaTable.LoadedModule
Annulus Games 1 year ago
parent
commit
a2b44f661e

+ 2 - 0
src/Lua/LuaState.cs

@@ -13,6 +13,7 @@ public sealed class LuaState
     readonly LuaMainThread mainThread = new();
     FastListCore<UpValue> openUpValues;
     FastStackCore<LuaThread> threadStack;
+    readonly LuaTable packages = new();
     readonly LuaTable environment;
     readonly UpValue envUpValue;
     bool isRunning;
@@ -22,6 +23,7 @@ public sealed class LuaState
     internal ref FastListCore<UpValue> OpenUpValues => ref openUpValues;
 
     public LuaTable Environment => environment;
+    public LuaTable LoadedModules => packages;
     public LuaMainThread MainThread => mainThread;
     public LuaThread CurrentThread
     {

+ 2 - 2
src/Lua/LuaTable.cs

@@ -101,7 +101,7 @@ public sealed class LuaTable
             }
         }
 
-        return dictionary.TryGetValue(key, out value);
+        return dictionary.TryGetValue(key, out value) && value.Type is not LuaValueType.Nil;
     }
 
     public bool ContainsKey(LuaValue key)
@@ -116,7 +116,7 @@ public sealed class LuaTable
             return index > 0 && index <= array.Length && array[index - 1].Type != LuaValueType.Nil;
         }
 
-        return dictionary.ContainsKey(key);
+        return dictionary.TryGetValue(key, out var value) && value.Type is not LuaValueType.Nil;
     }
 
     public LuaValue RemoveAt(int index)

+ 8 - 15
src/Lua/Standard/OpenLibExtensions.cs

@@ -13,18 +13,6 @@ namespace Lua.Standard;
 
 public static class OpenLibExtensions
 {
-    sealed class StringIndexMetamethod(LuaTable table) : LuaFunction
-    {
-        protected override ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
-        {
-            context.GetArgument<string>(0);
-            var key = context.GetArgument(1);
-
-            buffer.Span[0] = table[key];
-            return new(1);
-        }
-    }
-
     static readonly LuaFunction[] baseFunctions = [
         AssertFunction.Instance,
         ErrorFunction.Instance,
@@ -188,14 +176,14 @@ public static class OpenLibExtensions
         math["huge"] = double.PositiveInfinity;
 
         state.Environment["math"] = math;
+        state.LoadedModules["math"] = math;
     }
 
     public static void OpenModuleLibrary(this LuaState state)
     {
-        var package = new LuaTable(0, 1);
-        package["loaded"] = new LuaTable();
+        var package = new LuaTable();
+        package["loaded"] = state.LoadedModules;
         state.Environment["package"] = package;
-
         state.Environment[RequireFunction.Instance.Name] = RequireFunction.Instance;
     }
 
@@ -208,6 +196,7 @@ public static class OpenLibExtensions
         }
 
         state.Environment["table"] = table;
+        state.LoadedModules["table"] = table;
     }
 
     public static void OpenStringLibrary(this LuaState state)
@@ -219,6 +208,7 @@ public static class OpenLibExtensions
         }
 
         state.Environment["string"] = @string;
+        state.LoadedModules["string"] = @string;
 
         // set __index
         var key = new LuaValue("");
@@ -244,6 +234,7 @@ public static class OpenLibExtensions
         io["stderr"] = new FileHandle(Console.OpenStandardError());
 
         state.Environment["io"] = io;
+        state.LoadedModules["io"] = io;
     }
 
     public static void OpenOperatingSystemLibrary(this LuaState state)
@@ -255,6 +246,7 @@ public static class OpenLibExtensions
         }
 
         state.Environment["os"] = os;
+        state.LoadedModules["os"] = os;
     }
 
     public static void OpenBitwiseLibrary(this LuaState state)
@@ -266,6 +258,7 @@ public static class OpenLibExtensions
         }
 
         state.Environment["bit32"] = bit32;
+        state.LoadedModules["bit32"] = bit32;
     }
 
     public static void OpenStandardLibraries(this LuaState state)

+ 13 - 0
src/Lua/Standard/Text/StringIndexMetamethod.cs

@@ -0,0 +1,13 @@
+namespace Lua.Standard.Text;
+
+public sealed class StringIndexMetamethod(LuaTable table) : LuaFunction
+{
+    protected override ValueTask<int> InvokeAsyncCore(LuaFunctionExecutionContext context, Memory<LuaValue> buffer, CancellationToken cancellationToken)
+    {
+        context.GetArgument<string>(0);
+        var key = context.GetArgument(1);
+
+        buffer.Span[0] = table[key];
+        return new(1);
+    }
+}