diff --git a/src/Lua/Standard/BasicLibrary.cs b/src/Lua/Standard/BasicLibrary.cs index f1bbab98..e6a49b9f 100644 --- a/src/Lua/Standard/BasicLibrary.cs +++ b/src/Lua/Standard/BasicLibrary.cs @@ -9,6 +9,20 @@ namespace Lua.Standard; public sealed class BasicLibrary { public static readonly BasicLibrary Instance = new(); + static readonly HashSet KnownCollectGarbageOptions = new(StringComparer.Ordinal) + { + "collect", + "stop", + "restart", + "count", + "step", + "setpause", + "setstepmul", + "setmajorinc", + "isrunning", + "incremental", + "generational" + }; public BasicLibrary() { @@ -83,7 +97,11 @@ public ValueTask CollectGarbage(LuaFunctionExecutionContext context, Cancel { if (context.HasArgument(0)) { - context.GetArgument(0); + var option = context.GetArgument(0); + if (!KnownCollectGarbageOptions.Contains(option)) + { + throw new LuaRuntimeException(context.State, $"bad argument #1 to 'collectgarbage' (invalid option '{option}')"); + } } GC.Collect(); diff --git a/src/Lua/Standard/OpenLibsExtensions.cs b/src/Lua/Standard/OpenLibsExtensions.cs index 4d91f9f0..a17b5969 100644 --- a/src/Lua/Standard/OpenLibsExtensions.cs +++ b/src/Lua/Standard/OpenLibsExtensions.cs @@ -52,7 +52,9 @@ public static void OpenIOLibrary(this LuaState state) var registry = globalState.Registry; var standardIO = globalState.Platform.StandardIO; - LuaValue stdin = new(new FileHandle(standardIO.Input)); + var stdinHandle = new FileHandle(standardIO.Input); + ((ILuaUserData)stdinHandle).Metatable!["__gc"] = new LuaFunction("stdin.__gc", (context, cancellationToken) => throw new LuaRuntimeException(context.State, "bad argument #1 to '__gc' (no value)")); + LuaValue stdin = new(stdinHandle); LuaValue stdout = new(new FileHandle(standardIO.Output)); LuaValue stderr = new(new FileHandle(standardIO.Error)); registry["_IO_input"] = stdin;