diff --git a/src/Lua/Standard/BasicLibrary.cs b/src/Lua/Standard/BasicLibrary.cs index 84a3b1f1..94904d30 100644 --- a/src/Lua/Standard/BasicLibrary.cs +++ b/src/Lua/Standard/BasicLibrary.cs @@ -4,66 +4,65 @@ namespace Lua.Standard; -public static class BasicLibrary +public sealed class BasicLibrary { - public static void OpenBasicLibrary(this LuaState state) - { - state.Environment["_G"] = state.Environment; - state.Environment["_VERSION"] = "Lua 5.2"; - foreach (var func in Functions) - { - state.Environment[func.Name] = func; - } - } + public static readonly BasicLibrary Instance = new(); - static readonly LuaFunction[] Functions = [ - new("assert", Assert), - new("collectgarbage", CollectGarbage), - new("dofile", DoFile), - new("error", Error), - new("getmetatable", GetMetatable), - new("ipairs", IPairs), - new("loadfile", LoadFile), - new("load", Load), - new("next", Next), - new("pairs", Pairs), - new("pcall", PCall), - new("print", Print), - new("rawequal", RawEqual), - new("rawget", RawGet), - new("rawlen", RawLen), - new("rawset", RawSet), - new("select", Select), - new("setmetatable", SetMetatable), - new("tonumber", ToNumber), - new("tostring", ToString), - new("type", Type), - new("xpcall", XPCall), - ]; - - static readonly LuaFunction IPairsIterator = new("iterator", (context, buffer, cancellationToken) => + public BasicLibrary() { - var table = context.GetArgument(0); - var i = context.GetArgument(1); + Functions = [ + new("assert", Assert), + new("collectgarbage", CollectGarbage), + new("dofile", DoFile), + new("error", Error), + new("getmetatable", GetMetatable), + new("ipairs", IPairs), + new("loadfile", LoadFile), + new("load", Load), + new("next", Next), + new("pairs", Pairs), + new("pcall", PCall), + new("print", Print), + new("rawequal", RawEqual), + new("rawget", RawGet), + new("rawlen", RawLen), + new("rawset", RawSet), + new("select", Select), + new("setmetatable", SetMetatable), + new("tonumber", ToNumber), + new("tostring", ToString), + new("type", Type), + new("xpcall", XPCall), + ]; + + IPairsIterator = new("iterator", (context, buffer, cancellationToken) => + { + var table = context.GetArgument(0); + var i = context.GetArgument(1); + + i++; + if (table.TryGetValue(i, out var value)) + { + buffer.Span[0] = i; + buffer.Span[1] = value; + } + else + { + buffer.Span[0] = LuaValue.Nil; + buffer.Span[1] = LuaValue.Nil; + } - i++; - if (table.TryGetValue(i, out var value)) - { - buffer.Span[0] = i; - buffer.Span[1] = value; - } - else - { - buffer.Span[0] = LuaValue.Nil; - buffer.Span[1] = LuaValue.Nil; - } + return new(2); + }); - return new(2); - }); + PairsIterator = new("iterator", Next); + } - static readonly LuaFunction PairsIterator = new("iterator", Next); + public readonly LuaFunction[] Functions; + readonly LuaFunction IPairsIterator; + readonly LuaFunction PairsIterator; - public static ValueTask Assert(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Assert(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); @@ -82,13 +81,13 @@ public static ValueTask Assert(LuaFunctionExecutionContext context, Memory< return new(context.ArgumentCount); } - public static ValueTask CollectGarbage(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask CollectGarbage(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { GC.Collect(); return new(0); } - public static async ValueTask DoFile(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public async ValueTask DoFile(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); @@ -100,7 +99,7 @@ public static async ValueTask DoFile(LuaFunctionExecutionContext context, M return await new Closure(context.State, chunk).InvokeAsync(context, buffer, cancellationToken); } - public static ValueTask Error(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Error(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var obj = context.ArgumentCount == 0 || context.Arguments[0].Type is LuaValueType.Nil ? "(error object is a nil value)" @@ -109,7 +108,7 @@ public static ValueTask Error(LuaFunctionExecutionContext context, Memory GetMetatable(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask GetMetatable(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); @@ -136,7 +135,7 @@ public static ValueTask GetMetatable(LuaFunctionExecutionContext context, M return new(1); } - public static ValueTask IPairs(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask IPairs(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); @@ -157,7 +156,7 @@ public static ValueTask IPairs(LuaFunctionExecutionContext context, Memory< return new(3); } - public static async ValueTask LoadFile(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public async ValueTask LoadFile(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { // Lua-CSharp does not support binary chunks, the mode argument is ignored. var arg0 = context.GetArgument(0); @@ -182,7 +181,7 @@ public static async ValueTask LoadFile(LuaFunctionExecutionContext context, } } - public static ValueTask Load(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Load(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { // Lua-CSharp does not support binary chunks, the mode argument is ignored. var arg0 = context.GetArgument(0); @@ -223,7 +222,7 @@ public static ValueTask Load(LuaFunctionExecutionContext context, Memory Next(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Next(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); var arg1 = context.HasArgument(1) ? context.Arguments[1] : LuaValue.Nil; @@ -241,7 +240,7 @@ public static ValueTask Next(LuaFunctionExecutionContext context, Memory Pairs(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Pairs(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); @@ -262,7 +261,7 @@ public static ValueTask Pairs(LuaFunctionExecutionContext context, Memory PCall(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public async ValueTask PCall(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); @@ -290,7 +289,7 @@ public static async ValueTask PCall(LuaFunctionExecutionContext context, Me } } - public static async ValueTask Print(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public async ValueTask Print(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { using var methodBuffer = new PooledArray(1); @@ -305,7 +304,7 @@ public static async ValueTask Print(LuaFunctionExecutionContext context, Me return 0; } - public static ValueTask RawEqual(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask RawEqual(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); var arg1 = context.GetArgument(1); @@ -314,7 +313,7 @@ public static ValueTask RawEqual(LuaFunctionExecutionContext context, Memor return new(1); } - public static ValueTask RawGet(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask RawGet(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); var arg1 = context.GetArgument(1); @@ -323,7 +322,7 @@ public static ValueTask RawGet(LuaFunctionExecutionContext context, Memory< return new(1); } - public static ValueTask RawLen(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask RawLen(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); @@ -343,7 +342,7 @@ public static ValueTask RawLen(LuaFunctionExecutionContext context, Memory< return new(1); } - public static ValueTask RawSet(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask RawSet(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); var arg1 = context.GetArgument(1); @@ -353,7 +352,7 @@ public static ValueTask RawSet(LuaFunctionExecutionContext context, Memory< return new(0); } - public static ValueTask Select(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Select(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); @@ -391,7 +390,7 @@ public static ValueTask Select(LuaFunctionExecutionContext context, Memory< } } - public static ValueTask SetMetatable(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask SetMetatable(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); var arg1 = context.GetArgument(1); @@ -418,7 +417,7 @@ public static ValueTask SetMetatable(LuaFunctionExecutionContext context, M return new(1); } - public static ValueTask ToNumber(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask ToNumber(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var e = context.GetArgument(0); int? toBase = context.HasArgument(1) @@ -554,13 +553,13 @@ static double StringToDouble(ReadOnlySpan text, int toBase) return value; } - public static ValueTask ToString(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask ToString(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); return arg0.CallToStringAsync(context, buffer, cancellationToken); } - public static ValueTask Type(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Type(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); @@ -580,7 +579,7 @@ public static ValueTask Type(LuaFunctionExecutionContext context, Memory XPCall(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public async ValueTask XPCall(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); var arg1 = context.GetArgument(1); diff --git a/src/Lua/Standard/BitwiseLibrary.cs b/src/Lua/Standard/BitwiseLibrary.cs index f9cbe06c..d4ad2d08 100644 --- a/src/Lua/Standard/BitwiseLibrary.cs +++ b/src/Lua/Standard/BitwiseLibrary.cs @@ -2,36 +2,31 @@ namespace Lua.Standard; -public static class BitwiseLibrary +public sealed class BitwiseLibrary { - public static void OpenBitwiseLibrary(this LuaState state) - { - var bit32 = new LuaTable(0, Functions.Length); - foreach (var func in Functions) - { - bit32[func.Name] = func; - } + public static readonly BitwiseLibrary Instance = new(); - state.Environment["bit32"] = bit32; - state.LoadedModules["bit32"] = bit32; + public BitwiseLibrary() + { + Functions = [ + new("arshift", ArShift), + new("band", BAnd), + new("bnot", BNot), + new("bor", BOr), + new("btest", BTest), + new("bxor", BXor), + new("extract", Extract), + new("lrotate", LRotate), + new("lshift", LShift), + new("replace", Replace), + new("rrotate", RRotate), + new("rshift", RShift), + ]; } - static readonly LuaFunction[] Functions = [ - new ("arshift", ArShift), - new ("band", BAnd), - new ("bnot", BNot), - new ("bor", BOr), - new ("btest", BTest), - new ("bxor", BXor), - new ("extract", Extract), - new ("lrotate", LRotate), - new ("lshift", LShift), - new ("replace", Replace), - new ("rrotate", RRotate), - new ("rshift", RShift), - ]; - - public static ValueTask ArShift(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public readonly LuaFunction[] Functions; + + public ValueTask ArShift(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var x = context.GetArgument(0); var disp = context.GetArgument(1); @@ -55,7 +50,7 @@ public static ValueTask ArShift(LuaFunctionExecutionContext context, Memory return new(1); } - public static ValueTask BAnd(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask BAnd(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { if (context.ArgumentCount == 0) { @@ -81,7 +76,7 @@ public static ValueTask BAnd(LuaFunctionExecutionContext context, Memory BNot(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask BNot(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); LuaRuntimeException.ThrowBadArgumentIfNumberIsNotInteger(context.State, "bnot", 1, arg0); @@ -91,7 +86,7 @@ public static ValueTask BNot(LuaFunctionExecutionContext context, Memory BOr(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask BOr(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { if (context.ArgumentCount == 0) { @@ -117,7 +112,7 @@ public static ValueTask BOr(LuaFunctionExecutionContext context, Memory BTest(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask BTest(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { if (context.ArgumentCount == 0) { @@ -143,7 +138,7 @@ public static ValueTask BTest(LuaFunctionExecutionContext context, Memory BXor(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask BXor(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { if (context.ArgumentCount == 0) { @@ -169,7 +164,7 @@ public static ValueTask BXor(LuaFunctionExecutionContext context, Memory Extract(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Extract(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); var arg1 = context.GetArgument(1); @@ -200,7 +195,7 @@ public static ValueTask Extract(LuaFunctionExecutionContext context, Memory return new(1); } - public static ValueTask LRotate(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask LRotate(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var x = context.GetArgument(0); var disp = context.GetArgument(1); @@ -224,7 +219,7 @@ public static ValueTask LRotate(LuaFunctionExecutionContext context, Memory return new(1); } - public static ValueTask LShift(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask LShift(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var x = context.GetArgument(0); var disp = context.GetArgument(1); @@ -252,7 +247,7 @@ public static ValueTask LShift(LuaFunctionExecutionContext context, Memory< return new(1); } - public static ValueTask Replace(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Replace(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); var arg1 = context.GetArgument(1); @@ -288,7 +283,7 @@ public static ValueTask Replace(LuaFunctionExecutionContext context, Memory return new(1); } - public static ValueTask RRotate(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask RRotate(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var x = context.GetArgument(0); var disp = context.GetArgument(1); @@ -312,7 +307,7 @@ public static ValueTask RRotate(LuaFunctionExecutionContext context, Memory return new(1); } - public static ValueTask RShift(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask RShift(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var x = context.GetArgument(0); var disp = context.GetArgument(1); diff --git a/src/Lua/Standard/CoroutineLibrary.cs b/src/Lua/Standard/CoroutineLibrary.cs index 6be68e90..af20943a 100644 --- a/src/Lua/Standard/CoroutineLibrary.cs +++ b/src/Lua/Standard/CoroutineLibrary.cs @@ -1,47 +1,43 @@ namespace Lua.Standard; -public static class CoroutineLibrary +public sealed class CoroutineLibrary { - public static void OpenCoroutineLibrary(this LuaState state) - { - var coroutine = new LuaTable(0, Functions.Length); - foreach (var func in Functions) - { - coroutine[func.Name] = func; - } + public static readonly CoroutineLibrary Instance = new(); - state.Environment["coroutine"] = coroutine; + public CoroutineLibrary() + { + Functions = [ + new("create", Create), + new("resume", Resume), + new("running", Running), + new("wrap", Wrap), + new("yield", Yield), + ]; } - static readonly LuaFunction[] Functions = [ - new("create", Create), - new("resume", Resume), - new("running", Running), - new("wrap", Wrap), - new("yield", Yield), - ]; + public readonly LuaFunction[] Functions; - public static ValueTask Create(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Create(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); buffer.Span[0] = new LuaCoroutine(arg0, true); return new(1); } - public static ValueTask Resume(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Resume(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var thread = context.GetArgument(0); return thread.ResumeAsync(context, buffer, cancellationToken); } - public static ValueTask Running(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Running(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { buffer.Span[0] = context.Thread; buffer.Span[1] = context.Thread == context.State.MainThread; return new(2); } - public static ValueTask Status(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Status(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var thread = context.GetArgument(0); buffer.Span[0] = thread.GetStatus() switch @@ -55,7 +51,7 @@ public static ValueTask Status(LuaFunctionExecutionContext context, Memory< return new(1); } - public static ValueTask Wrap(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Wrap(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); var thread = new LuaCoroutine(arg0, false); @@ -81,7 +77,7 @@ public static ValueTask Wrap(LuaFunctionExecutionContext context, Memory Yield(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Yield(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { return context.Thread.YieldAsync(context, buffer, cancellationToken); } diff --git a/src/Lua/Standard/IOLibrary.cs b/src/Lua/Standard/IOLibrary.cs index f54597f5..4a95d220 100644 --- a/src/Lua/Standard/IOLibrary.cs +++ b/src/Lua/Standard/IOLibrary.cs @@ -3,37 +3,28 @@ namespace Lua.Standard; -public static class IOLibrary +public sealed class IOLibrary { - public static void OpenIOLibrary(this LuaState state) - { - var io = new LuaTable(0, Functions.Length); - foreach (var func in Functions) - { - io[func.Name] = func; - } + public static readonly IOLibrary Instance = new(); - io["stdio"] = new LuaValue(new FileHandle(Console.OpenStandardInput())); - io["stdout"] = new LuaValue(new FileHandle(Console.OpenStandardOutput())); - io["stderr"] = new LuaValue(new FileHandle(Console.OpenStandardError())); - - state.Environment["io"] = io; - state.LoadedModules["io"] = io; + public IOLibrary() + { + Functions = [ + new("close", Close), + new("flush", Flush), + new("input", Input), + new("lines", Lines), + new("open", Open), + new("output", Output), + new("read", Read), + new("type", Type), + new("write", Write), + ]; } - static readonly LuaFunction[] Functions = [ - new("close", Close), - new("flush", Flush), - new("input", Input), - new("lines", Lines), - new("open", Open), - new("output", Output), - new("read", Read), - new("type", Type), - new("write", Write), - ]; - - public static ValueTask Close(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public readonly LuaFunction[] Functions; + + public ValueTask Close(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var file = context.HasArgument(0) ? context.GetArgument(0) @@ -54,7 +45,7 @@ public static ValueTask Close(LuaFunctionExecutionContext context, Memory Flush(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Flush(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var file = context.State.Environment["io"].Read()["stdout"].Read(); @@ -73,7 +64,7 @@ public static ValueTask Flush(LuaFunctionExecutionContext context, Memory Input(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Input(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var io = context.State.Environment["io"].Read(); @@ -100,7 +91,7 @@ public static ValueTask Input(LuaFunctionExecutionContext context, Memory Lines(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Lines(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { if (context.ArgumentCount == 0) { @@ -140,7 +131,7 @@ public static ValueTask Lines(LuaFunctionExecutionContext context, Memory Open(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Open(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var fileName = context.GetArgument(0); var mode = context.HasArgument(1) @@ -151,7 +142,7 @@ public static ValueTask Open(LuaFunctionExecutionContext context, Memory Output(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Output(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var io = context.State.Environment["io"].Read(); @@ -178,14 +169,14 @@ public static ValueTask Output(LuaFunctionExecutionContext context, Memory< } } - public static ValueTask Read(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Read(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var file = context.State.Environment["io"].Read()["stdio"].Read(); var resultCount = IOHelper.Read(context.State, file, "read", 0, context.Arguments, buffer, false); return new(resultCount); } - public static ValueTask Type(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Type(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); @@ -201,7 +192,7 @@ public static ValueTask Type(LuaFunctionExecutionContext context, Memory Write(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Write(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var file = context.State.Environment["io"].Read()["stdout"].Read(); var resultCount = IOHelper.Write(file, "write", context, buffer); diff --git a/src/Lua/Standard/MathematicsLibrary.cs b/src/Lua/Standard/MathematicsLibrary.cs index 7dd957a9..d72e453a 100644 --- a/src/Lua/Standard/MathematicsLibrary.cs +++ b/src/Lua/Standard/MathematicsLibrary.cs @@ -1,85 +1,74 @@ namespace Lua.Standard; -public static class MathematicsLibrary +public sealed class MathematicsLibrary { - public static void OpenMathLibrary(this LuaState state) - { - state.Environment[RandomInstanceKey] = new(new RandomUserData(new Random())); - - var math = new LuaTable(0, Functions.Length); - foreach (var func in Functions) - { - math[func.Name] = func; - } - - math["pi"] = Math.PI; - math["huge"] = double.PositiveInfinity; + public static readonly MathematicsLibrary Instance = new(); + public const string RandomInstanceKey = "__lua_mathematics_library_random_instance"; - state.Environment["math"] = math; - state.LoadedModules["math"] = math; + public MathematicsLibrary() + { + Functions = [ + new("abs", Abs), + new("acos", Acos), + new("asin", Asin), + new("atan2", Atan2), + new("atan", Atan), + new("ceil", Ceil), + new("cos", Cos), + new("cosh", Cosh), + new("deg", Deg), + new("exp", Exp), + new("floor", Floor), + new("fmod", Fmod), + new("frexp", Frexp), + new("ldexp", Ldexp), + new("log", Log), + new("max", Max), + new("min", Min), + new("modf", Modf), + new("pow", Pow), + new("rad", Rad), + new("random", Random), + new("randomseed", RandomSeed), + new("sin", Sin), + new("sinh", Sinh), + new("sqrt", Sqrt), + new("tan", Tan), + new("tanh", Tanh), + ]; } - public const string RandomInstanceKey = "__lua_mathematics_library_random_instance"; + public readonly LuaFunction[] Functions; - static readonly LuaFunction[] Functions = [ - new("abs", Abs), - new("acos", Acos), - new("asin", Asin), - new("atan2", Atan2), - new("atan", Atan), - new("ceil", Ceil), - new("cos", Cos), - new("cosh", Cosh), - new("deg", Deg), - new("exp", Exp), - new("floor", Floor), - new("fmod", Fmod), - new("frexp", Frexp), - new("ldexp", Ldexp), - new("log", Log), - new("max", Max), - new("min", Min), - new("modf", Modf), - new("pow", Pow), - new("rad", Rad), - new("random", Random), - new("randomseed", RandomSeed), - new("sin", Sin), - new("sinh", Sinh), - new("sqrt", Sqrt), - new("tan", Tan), - new("tanh", Tanh), - ]; - - sealed class RandomUserData(Random random) : ILuaUserData + public sealed class RandomUserData(Random random) : ILuaUserData { - static LuaTable? SharedMetatable; + LuaTable? SharedMetatable; public LuaTable? Metatable { get => SharedMetatable; set => SharedMetatable = value; } public Random Random { get; } = random; } - public static ValueTask Abs(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Abs(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); buffer.Span[0] = Math.Abs(arg0); return new(1); } - public static ValueTask Acos(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Acos(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); buffer.Span[0] = Math.Acos(arg0); return new(1); } - public static ValueTask Asin(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Asin(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); buffer.Span[0] = Math.Asin(arg0); return new(1); } - public static ValueTask Atan2(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Atan2(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); var arg1 = context.GetArgument(1); @@ -88,56 +77,56 @@ public static ValueTask Atan2(LuaFunctionExecutionContext context, Memory Atan(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Atan(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); buffer.Span[0] = Math.Atan(arg0); return new(1); } - public static ValueTask Ceil(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Ceil(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); buffer.Span[0] = Math.Ceiling(arg0); return new(1); } - public static ValueTask Cos(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Cos(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); buffer.Span[0] = Math.Cos(arg0); return new(1); } - public static ValueTask Cosh(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Cosh(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); buffer.Span[0] = Math.Cosh(arg0); return new(1); } - public static ValueTask Deg(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Deg(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); buffer.Span[0] = arg0 * (180.0 / Math.PI); return new(1); } - public static ValueTask Exp(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Exp(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); buffer.Span[0] = Math.Exp(arg0); return new(1); } - public static ValueTask Floor(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Floor(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); buffer.Span[0] = Math.Floor(arg0); return new(1); } - public static ValueTask Fmod(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Fmod(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); var arg1 = context.GetArgument(1); @@ -145,7 +134,7 @@ public static ValueTask Fmod(LuaFunctionExecutionContext context, Memory Frexp(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Frexp(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); @@ -155,7 +144,7 @@ public static ValueTask Frexp(LuaFunctionExecutionContext context, Memory Ldexp(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Ldexp(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); var arg1 = context.GetArgument(1); @@ -164,7 +153,7 @@ public static ValueTask Ldexp(LuaFunctionExecutionContext context, Memory Log(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Log(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); @@ -181,7 +170,7 @@ public static ValueTask Log(LuaFunctionExecutionContext context, Memory Max(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Max(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var x = context.GetArgument(0); for (int i = 1; i < context.ArgumentCount; i++) @@ -194,7 +183,7 @@ public static ValueTask Max(LuaFunctionExecutionContext context, Memory Min(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Min(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var x = context.GetArgument(0); for (int i = 1; i < context.ArgumentCount; i++) @@ -207,7 +196,7 @@ public static ValueTask Min(LuaFunctionExecutionContext context, Memory Modf(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Modf(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); var (i, f) = MathEx.Modf(arg0); @@ -216,7 +205,7 @@ public static ValueTask Modf(LuaFunctionExecutionContext context, Memory Pow(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Pow(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); var arg1 = context.GetArgument(1); @@ -225,14 +214,14 @@ public static ValueTask Pow(LuaFunctionExecutionContext context, Memory Rad(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Rad(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); buffer.Span[0] = arg0 * (Math.PI / 180.0); return new(1); } - public static ValueTask Random(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Random(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var rand = context.State.Environment[RandomInstanceKey].Read().Random; @@ -255,42 +244,42 @@ public static ValueTask Random(LuaFunctionExecutionContext context, Memory< return new(1); } - public static ValueTask RandomSeed(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask RandomSeed(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); context.State.Environment[RandomInstanceKey] = new(new RandomUserData(new Random((int)BitConverter.DoubleToInt64Bits(arg0)))); return new(0); } - public static ValueTask Sin(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Sin(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); buffer.Span[0] = Math.Sin(arg0); return new(1); } - public static ValueTask Sinh(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Sinh(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); buffer.Span[0] = Math.Sinh(arg0); return new(1); } - public static ValueTask Sqrt(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Sqrt(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); buffer.Span[0] = Math.Sqrt(arg0); return new(1); } - public static ValueTask Tan(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Tan(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); buffer.Span[0] = Math.Tan(arg0); return new(1); } - public static ValueTask Tanh(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Tanh(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); buffer.Span[0] = Math.Tanh(arg0); diff --git a/src/Lua/Standard/ModuleLibrary.cs b/src/Lua/Standard/ModuleLibrary.cs index 30816e2c..562a7114 100644 --- a/src/Lua/Standard/ModuleLibrary.cs +++ b/src/Lua/Standard/ModuleLibrary.cs @@ -4,17 +4,18 @@ namespace Lua.Standard; -public static class ModuleLibrary +public sealed class ModuleLibrary { - public static void OpenModuleLibrary(this LuaState state) + public static readonly ModuleLibrary Instance = new(); + + public ModuleLibrary() { - var package = new LuaTable(); - package["loaded"] = state.LoadedModules; - state.Environment["package"] = package; - state.Environment["require"] = new LuaFunction("require", Require); + RequireFunction = new("require", Require); } - public static async ValueTask Require(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public readonly LuaFunction RequireFunction; + + public async ValueTask Require(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); var loaded = context.State.LoadedModules; diff --git a/src/Lua/Standard/OpenLibsExtensions.cs b/src/Lua/Standard/OpenLibsExtensions.cs index 4157968a..ed2fb763 100644 --- a/src/Lua/Standard/OpenLibsExtensions.cs +++ b/src/Lua/Standard/OpenLibsExtensions.cs @@ -1,7 +1,136 @@ +using Lua.Runtime; + namespace Lua.Standard; public static class OpenLibsExtensions { + public static void OpenBasicLibrary(this LuaState state) + { + state.Environment["_G"] = state.Environment; + state.Environment["_VERSION"] = "Lua 5.2"; + foreach (var func in BasicLibrary.Instance.Functions) + { + state.Environment[func.Name] = func; + } + } + + public static void OpenBitwiseLibrary(this LuaState state) + { + var bit32 = new LuaTable(0, BitwiseLibrary.Instance.Functions.Length); + foreach (var func in BitwiseLibrary.Instance.Functions) + { + bit32[func.Name] = func; + } + + state.Environment["bit32"] = bit32; + state.LoadedModules["bit32"] = bit32; + } + + public static void OpenCoroutineLibrary(this LuaState state) + { + var coroutine = new LuaTable(0, CoroutineLibrary.Instance.Functions.Length); + foreach (var func in CoroutineLibrary.Instance.Functions) + { + coroutine[func.Name] = func; + } + + state.Environment["coroutine"] = coroutine; + } + + public static void OpenIOLibrary(this LuaState state) + { + var io = new LuaTable(0, IOLibrary.Instance.Functions.Length); + foreach (var func in IOLibrary.Instance.Functions) + { + io[func.Name] = func; + } + + io["stdio"] = new LuaValue(new FileHandle(Console.OpenStandardInput())); + io["stdout"] = new LuaValue(new FileHandle(Console.OpenStandardOutput())); + io["stderr"] = new LuaValue(new FileHandle(Console.OpenStandardError())); + + state.Environment["io"] = io; + state.LoadedModules["io"] = io; + } + + public static void OpenMathLibrary(this LuaState state) + { + state.Environment[MathematicsLibrary.RandomInstanceKey] = new(new MathematicsLibrary.RandomUserData(new Random())); + + var math = new LuaTable(0, MathematicsLibrary.Instance.Functions.Length); + foreach (var func in MathematicsLibrary.Instance.Functions) + { + math[func.Name] = func; + } + + math["pi"] = Math.PI; + math["huge"] = double.PositiveInfinity; + + state.Environment["math"] = math; + state.LoadedModules["math"] = math; + } + + public static void OpenModuleLibrary(this LuaState state) + { + var package = new LuaTable(); + package["loaded"] = state.LoadedModules; + state.Environment["package"] = package; + state.Environment["require"] = ModuleLibrary.Instance.RequireFunction; + } + + public static void OpenOperatingSystemLibrary(this LuaState state) + { + var os = new LuaTable(0, OperatingSystemLibrary.Instance.Functions.Length); + foreach (var func in OperatingSystemLibrary.Instance.Functions) + { + os[func.Name] = func; + } + + state.Environment["os"] = os; + state.LoadedModules["os"] = os; + } + + public static void OpenStringLibrary(this LuaState state) + { + var @string = new LuaTable(0, StringLibrary.Instance.Functions.Length); + foreach (var func in StringLibrary.Instance.Functions) + { + @string[func.Name] = func; + } + + state.Environment["string"] = @string; + state.LoadedModules["string"] = @string; + + // set __index + var key = new LuaValue(""); + if (!state.TryGetMetatable(key, out var metatable)) + { + metatable = new(); + state.SetMetatable(key, metatable); + } + + metatable[Metamethods.Index] = new LuaFunction("index", (context, buffer, cancellationToken) => + { + context.GetArgument(0); + var key = context.GetArgument(1); + + buffer.Span[0] = @string[key]; + return new(1); + }); + } + + public static void OpenTableLibrary(this LuaState state) + { + var table = new LuaTable(0, TableLibrary.Instance.Functions.Length); + foreach (var func in TableLibrary.Instance.Functions) + { + table[func.Name] = func; + } + + state.Environment["table"] = table; + state.LoadedModules["table"] = table; + } + public static void OpenStandardLibraries(this LuaState state) { state.OpenBasicLibrary(); diff --git a/src/Lua/Standard/OperatingSystemLibrary.cs b/src/Lua/Standard/OperatingSystemLibrary.cs index 3d120a40..2c3f29e8 100644 --- a/src/Lua/Standard/OperatingSystemLibrary.cs +++ b/src/Lua/Standard/OperatingSystemLibrary.cs @@ -3,41 +3,36 @@ namespace Lua.Standard; -public static class OperatingSystemLibrary +public sealed class OperatingSystemLibrary { - public static void OpenOperatingSystemLibrary(this LuaState state) - { - var os = new LuaTable(0, Functions.Length); - foreach (var func in Functions) - { - os[func.Name] = func; - } + public static readonly OperatingSystemLibrary Instance = new(); - state.Environment["os"] = os; - state.LoadedModules["os"] = os; + public OperatingSystemLibrary() + { + Functions = [ + new("clock", Clock), + new("date", Date), + new("difftime", DiffTime), + new("execute", Execute), + new("exit", Exit), + new("getenv", GetEnv), + new("remove", Remove), + new("rename", Rename), + new("setlocale", SetLocale), + new("time", Time), + new("tmpname", TmpName), + ]; } - static readonly LuaFunction[] Functions = [ - new("clock", Clock), - new("date", Date), - new("difftime", DiffTime), - new("execute", Execute), - new("exit", Exit), - new("getenv", GetEnv), - new("remove", Remove), - new("rename", Rename), - new("setlocale", SetLocale), - new("time", Time), - new("tmpname", TmpName), - ]; - - public static ValueTask Clock(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public readonly LuaFunction[] Functions; + + public ValueTask Clock(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { buffer.Span[0] = DateTimeHelper.GetUnixTime(DateTime.UtcNow, Process.GetCurrentProcess().StartTime); return new(1); } - public static ValueTask Date(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Date(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var format = context.HasArgument(0) ? context.GetArgument(0).AsSpan() @@ -89,7 +84,7 @@ public static ValueTask Date(LuaFunctionExecutionContext context, Memory DiffTime(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask DiffTime(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var t2 = context.GetArgument(0); var t1 = context.GetArgument(1); @@ -97,7 +92,7 @@ public static ValueTask DiffTime(LuaFunctionExecutionContext context, Memor return new(1); } - public static ValueTask Execute(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Execute(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { // os.execute(command) is not supported @@ -112,7 +107,7 @@ public static ValueTask Execute(LuaFunctionExecutionContext context, Memory } } - public static ValueTask Exit(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Exit(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { // Ignore 'close' parameter @@ -146,14 +141,14 @@ public static ValueTask Exit(LuaFunctionExecutionContext context, Memory GetEnv(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask GetEnv(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var variable = context.GetArgument(0); buffer.Span[0] = Environment.GetEnvironmentVariable(variable) ?? LuaValue.Nil; return new(1); } - public static ValueTask Remove(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Remove(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var fileName = context.GetArgument(0); try @@ -171,7 +166,7 @@ public static ValueTask Remove(LuaFunctionExecutionContext context, Memory< } } - public static ValueTask Rename(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Rename(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var oldName = context.GetArgument(0); var newName = context.GetArgument(1); @@ -190,7 +185,7 @@ public static ValueTask Rename(LuaFunctionExecutionContext context, Memory< } } - public static ValueTask SetLocale(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask SetLocale(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { // os.setlocale is not supported (always return nil) @@ -198,7 +193,7 @@ public static ValueTask SetLocale(LuaFunctionExecutionContext context, Memo return new(1); } - public static ValueTask Time(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Time(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { if (context.HasArgument(0)) { @@ -214,7 +209,7 @@ public static ValueTask Time(LuaFunctionExecutionContext context, Memory TmpName(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask TmpName(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { buffer.Span[0] = Path.GetTempFileName(); return new(1); diff --git a/src/Lua/Standard/StringLibrary.cs b/src/Lua/Standard/StringLibrary.cs index ed20ac59..9eeb1bb1 100644 --- a/src/Lua/Standard/StringLibrary.cs +++ b/src/Lua/Standard/StringLibrary.cs @@ -1,57 +1,34 @@ using System.Text; using Lua.Internal; -using Lua.Runtime; namespace Lua.Standard; -public static class StringLibrary +public sealed class StringLibrary { - public static void OpenStringLibrary(this LuaState state) - { - var @string = new LuaTable(0, Functions.Length); - foreach (var func in Functions) - { - @string[func.Name] = func; - } - - state.Environment["string"] = @string; - state.LoadedModules["string"] = @string; - - // set __index - var key = new LuaValue(""); - if (!state.TryGetMetatable(key, out var metatable)) - { - metatable = new(); - state.SetMetatable(key, metatable); - } + public static readonly StringLibrary Instance = new(); - metatable[Metamethods.Index] = new LuaFunction("index", (context, buffer, cancellationToken) => - { - context.GetArgument(0); - var key = context.GetArgument(1); - - buffer.Span[0] = @string[key]; - return new(1); - }); + public StringLibrary() + { + Functions = [ + new("byte", Byte), + new("char", Char), + new("dump", Dump), + new("find", Find), + new("format", Format), + new("gmatch", GMatch), + new("gsub", GSub), + new("len", Len), + new("lower", Lower), + new("rep", Rep), + new("reverse", Reverse), + new("sub", Sub), + new("upper", Upper), + ]; } - static readonly LuaFunction[] Functions = [ - new("byte", Byte), - new("char", Char), - new("dump", Dump), - new("find", Find), - new("format", Format), - new("gmatch", GMatch), - new("gsub", GSub), - new("len", Len), - new("lower", Lower), - new("rep", Rep), - new("reverse", Reverse), - new("sub", Sub), - new("upper", Upper), - ]; - - public static ValueTask Byte(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public readonly LuaFunction[] Functions; + + public ValueTask Byte(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var s = context.GetArgument(0); var i = context.HasArgument(1) @@ -73,7 +50,7 @@ public static ValueTask Byte(LuaFunctionExecutionContext context, Memory Char(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Char(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { if (context.ArgumentCount == 0) { @@ -93,13 +70,13 @@ public static ValueTask Char(LuaFunctionExecutionContext context, Memory Dump(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Dump(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { // stirng.dump is not supported (throw exception) throw new NotSupportedException("stirng.dump is not supported"); } - public static ValueTask Find(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Find(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var s = context.GetArgument(0); var pattern = context.GetArgument(1); @@ -169,7 +146,7 @@ public static ValueTask Find(LuaFunctionExecutionContext context, Memory Format(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public async ValueTask Format(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var format = context.GetArgument(0); @@ -445,7 +422,7 @@ public static async ValueTask Format(LuaFunctionExecutionContext context, M return 1; } - public static ValueTask GMatch(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask GMatch(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var s = context.GetArgument(0); var pattern = context.GetArgument(1); @@ -487,7 +464,7 @@ public static ValueTask GMatch(LuaFunctionExecutionContext context, Memory< return new(1); } - public static async ValueTask GSub(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public async ValueTask GSub(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var s = context.GetArgument(0); var pattern = context.GetArgument(1); @@ -580,21 +557,21 @@ await func.InvokeAsync(context with return 1; } - public static ValueTask Len(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Len(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var s = context.GetArgument(0); buffer.Span[0] = s.Length; return new(1); } - public static ValueTask Lower(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Lower(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var s = context.GetArgument(0); buffer.Span[0] = s.ToLower(); return new(1); } - public static ValueTask Rep(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Rep(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var s = context.GetArgument(0); var n_arg = context.GetArgument(1); @@ -620,7 +597,7 @@ public static ValueTask Rep(LuaFunctionExecutionContext context, Memory Reverse(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Reverse(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var s = context.GetArgument(0); using var strBuffer = new PooledArray(s.Length); @@ -631,7 +608,7 @@ public static ValueTask Reverse(LuaFunctionExecutionContext context, Memory return new(1); } - public static ValueTask Sub(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Sub(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var s = context.GetArgument(0); var i = context.GetArgument(1); @@ -646,7 +623,7 @@ public static ValueTask Sub(LuaFunctionExecutionContext context, Memory Upper(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Upper(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var s = context.GetArgument(0); buffer.Span[0] = s.ToUpper(); diff --git a/src/Lua/Standard/TableLibrary.cs b/src/Lua/Standard/TableLibrary.cs index 83889469..0d3e39fa 100644 --- a/src/Lua/Standard/TableLibrary.cs +++ b/src/Lua/Standard/TableLibrary.cs @@ -5,28 +5,23 @@ namespace Lua.Standard; -public static class TableLibrary +public sealed class TableLibrary { - public static void OpenTableLibrary(this LuaState state) - { - var table = new LuaTable(0, Functions.Length); - foreach (var func in Functions) - { - table[func.Name] = func; - } + public static readonly TableLibrary Instance = new(); - state.Environment["table"] = table; - state.LoadedModules["table"] = table; + public TableLibrary() + { + Functions = [ + new("concat", Concat), + new("insert", Insert), + new("pack", Pack), + new("remove", Remove), + new("sort", Sort), + new("unpack", Unpack), + ]; } - static readonly LuaFunction[] Functions = [ - new("concat", Concat), - new("insert", Insert), - new("pack", Pack), - new("remove", Remove), - new("sort", Sort), - new("unpack", Unpack), - ]; + public readonly LuaFunction[] Functions; // TODO: optimize static readonly Chunk defaultComparer = new() @@ -47,7 +42,7 @@ public static void OpenTableLibrary(this LuaState state) UpValues = [], }; - public static ValueTask Concat(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Concat(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); var arg1 = context.HasArgument(1) @@ -86,7 +81,7 @@ public static ValueTask Concat(LuaFunctionExecutionContext context, Memory< return new(1); } - public static ValueTask Insert(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Insert(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var table = context.GetArgument(0); @@ -111,7 +106,7 @@ public static ValueTask Insert(LuaFunctionExecutionContext context, Memory< return new(0); } - public static ValueTask Pack(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Pack(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var table = new LuaTable(context.ArgumentCount, 1); @@ -126,7 +121,7 @@ public static ValueTask Pack(LuaFunctionExecutionContext context, Memory Remove(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Remove(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var table = context.GetArgument(0); var n_arg = context.HasArgument(1) @@ -157,7 +152,7 @@ public static ValueTask Remove(LuaFunctionExecutionContext context, Memory< return new(1); } - public static async ValueTask Sort(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public async ValueTask Sort(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); var arg1 = context.HasArgument(1) @@ -168,7 +163,7 @@ public static async ValueTask Sort(LuaFunctionExecutionContext context, Mem return 0; } - static async ValueTask QuickSortAsync(LuaFunctionExecutionContext context, Memory memory, int low, int high, LuaFunction comparer, CancellationToken cancellationToken) + async ValueTask QuickSortAsync(LuaFunctionExecutionContext context, Memory memory, int low, int high, LuaFunction comparer, CancellationToken cancellationToken) { if (low < high) { @@ -178,7 +173,7 @@ static async ValueTask QuickSortAsync(LuaFunctionExecutionContext context, Memor } } - static async ValueTask PartitionAsync(LuaFunctionExecutionContext context, Memory memory, int low, int high, LuaFunction comparer, CancellationToken cancellationToken) + async ValueTask PartitionAsync(LuaFunctionExecutionContext context, Memory memory, int low, int high, LuaFunction comparer, CancellationToken cancellationToken) { using var methodBuffer = new PooledArray(1); @@ -207,12 +202,12 @@ await comparer.InvokeAsync(context with } [MethodImpl(MethodImplOptions.AggressiveInlining)] - static void Swap(Span span, int i, int j) + void Swap(Span span, int i, int j) { (span[i], span[j]) = (span[j], span[i]); } - public static ValueTask Unpack(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) + public ValueTask Unpack(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var arg0 = context.GetArgument(0); var arg1 = context.HasArgument(1)