public void LuaNestedErrors() { using (var runtime = new LuaRuntime()) { Action errorer = () => { DoError(runtime); }; using (var func = runtime.CreateFunctionFromDelegate(errorer)) { runtime.Globals ["test"] = func; } Action errorer2 = () => { runtime.DoString("test()").Dispose(); }; using (var func = runtime.CreateFunctionFromDelegate(errorer2)) { runtime.Globals ["test2"] = func; } try { runtime.DoString(@" function test3() test2() end test3()"); } catch (LuaException e) { Assert.AreEqual(e.Message, "[LuaTable]"); Assert.IsInstanceOf <LuaTable>(e.Value); var tab = (LuaTable)e.Value; Assert.AreEqual(tab ["a"].ToBoolean(), true); Assert.IsNull(e.InnerException); } } }
public void TypeMapping() { bool called = false; TypeMappingTestDelegate cb = (a, b, c, d, e, f, g) => { Assert.AreEqual(10, a, "a"); Assert.AreEqual(20, b, "b"); Assert.AreEqual(0.5, c, "c"); Assert.AreEqual("foobar", d, "d"); Assert.AreEqual("dingus", e["widget"].ToString(), "e"); Assert.AreEqual(true, f, "f"); Assert.IsNull(g, "g"); called = true; }; using (var runtime = new LuaRuntime()) { using (var wrapper = runtime.CreateFunctionFromDelegate(cb)) { runtime.Globals["callback"] = wrapper; } runtime.DoString("callback(10, 20, 0.5, 'foobar', { widget='dingus' }, true, nil)"); } Assert.IsTrue(called, "called"); }
public void Metatables() { using (var runtime = new LuaRuntime()) { using (var tab = runtime.CreateTable()) { using (var mt = runtime.CreateTable()) { Func <LuaTable, string, LuaValue> index = (self, key) => { return("hey"); }; using (var func = runtime.CreateFunctionFromDelegate(index)) { mt ["__index"] = func; } tab.Metatable = mt; } runtime.Globals ["test"] = tab; using (var mt = tab.Metatable) { using (var index = mt ["__index"]) { Assert.IsInstanceOf(typeof(LuaFunction), index); } Assert.AreEqual(1, mt.Count); } } using (var ret = runtime.DoString("return test.this_key_doesnt_exist")) { Assert.AreEqual(1, ret.Count); Assert.AreEqual("hey", ret [0].ToString()); } } }
public LuaValue Get(LuaRuntime runtime) { if (IsMethod) return runtime.CreateFunctionFromDelegate((Func<LuaVararg, LuaValue>)Invoke); if (IsGetProperty) return ((PropertyInfo)Member).GetValue(Target, null).ToLuaValue(context); throw new LuaException("The property '{0}' is write-only".F(Member.Name)); }
public void ClrExceptionPropagation() { Action thrower = () => { throw new InvalidOperationException(); }; using (var runtime = new LuaRuntime()) { using (var wrapper = runtime.CreateFunctionFromDelegate(thrower)) { runtime.Globals["callback"] = wrapper; } runtime.DoString("callback()"); } }
public void CallbackOnCoroutineFails() { using (var runtime = new LuaRuntime()) { using (var callback = runtime.CreateFunctionFromDelegate(new Action(() => { Assert.Fail("Function called."); }))) { runtime.Globals["callback"] = callback; } using (var r = runtime.DoString("return coroutine.resume(coroutine.create(callback))")) { Assert.IsFalse(r[0].ToBoolean(), "Call succeeded."); Assert.IsTrue(r[1].ToString().EndsWith("Cannot enter the CLR from inside of a Lua coroutine."), "Error message is accurate."); } } }
public void LuaClrStaticMethods() { using (var runtime = new LuaRuntime()) { Func <LuaClrTypeObject> testex = () => { return(new LuaClrTypeObject(typeof(string))); }; using (var func = runtime.CreateFunctionFromDelegate(testex)) { runtime.Globals ["extest"] = func; } runtime.DoString(@" local str = extest() print(str.Join(',', {'Hello', ' world!'}, 0, 2)) "); } }
public LuaValue Get(LuaRuntime runtime) { if (IsMethod) { return(runtime.CreateFunctionFromDelegate((Func <LuaVararg, LuaValue>)Invoke)); } if (IsGetProperty) { return(((PropertyInfo)Member).GetValue(Target, null).ToLuaValue(context)); } throw new LuaException($"The property '{Member.Name}' is write-only"); }
public void Callback() { int? cbValue = null; Action<int> callback = x => cbValue = x; using (var runtime = new LuaRuntime()) { using (var wrapper = runtime.CreateFunctionFromDelegate(callback)) { runtime.Globals["callback"] = wrapper; } runtime.DoString("callback(42)"); } Assert.AreEqual(42, cbValue, "cbValue"); }
public void Callback() { int? cbValue = null; Action <int> callback = x => cbValue = x; using (var runtime = new LuaRuntime()) { using (var wrapper = runtime.CreateFunctionFromDelegate(callback)) { runtime.Globals["callback"] = wrapper; } runtime.DoString("callback(42)"); } Assert.AreEqual(42, cbValue, "cbValue"); }
public void HugeResultList() { var range = Enumerable.Range(1, 1000); Func <LuaVararg> fn = () => new LuaVararg(range.Select(i => (LuaNumber)i), true); using (var runtime = new LuaRuntime()) { using (var f = runtime.CreateFunctionFromDelegate(fn)) { runtime.Globals["callback"] = f; } using (var results = runtime.DoString("return callback()")) { Assert.AreEqual(range.Sum(), results.Select(i => (int)i.ToNumber().Value).Sum()); } } }
public void OpaqueClrObjectAsArgument() { object object1 = new object(); object object2 = null; using (var runtime = new LuaRuntime()) { runtime.Globals["o"] = new LuaOpaqueClrObject(object1); using (var d = runtime.CreateFunctionFromDelegate(new Action <object>(o => object2 = o))) { runtime.Globals["fn"] = d; } runtime.DoString("fn(o)").Dispose(); } Assert.AreSame(object1, object2); }
public void ClrEnums() { using (var runtime = new LuaRuntime()) { using (var func = runtime.CreateFunctionFromDelegate(new Func <Type>(() => typeof(string)))) { runtime.Globals ["get_string_type"] = func; } runtime.Globals ["StringComparison"] = new LuaClrTypeObject(typeof(StringComparison)); runtime.DoString(@" local string = get_string_type() if not string.Equals('Hello!', 'Hello!', StringComparison.InvariantCulture) then error('Strings aren\'t equal?') end ").Dispose(); } }
/// <summary> /// Creates a Lua function from a delegate. /// </summary> /// <param name="func">Delegate to wrap in a lua function.</param> /// <returns>A LuaFunction bound to the delegate.</returns> public LuaFunction SafeCreateFunction(Delegate func) { LuaFunction lf; lock (_luaState) { try { lf = (LuaFunction)_luaState.CreateFunctionFromDelegate(func); } catch (Exception ex) { lf = HandleException <LuaFunction>(ex, null); } } return(lf); }
public void OpaqueClrObjectAsArgument() { object object1 = new object(); object object2 = null; using (var runtime = new LuaRuntime()) { runtime.Globals["o"] = new LuaOpaqueClrObject(object1); using (var d = runtime.CreateFunctionFromDelegate(new Action<object>(o => object2 = o))) { runtime.Globals["fn"] = d; } runtime.DoString("fn(o)").Dispose(); } Assert.AreSame(object1, object2); }
public static void InitializeLua() { if (!File.Exists(StockMainLuaPath)) { Logger.Warn("No main.lua - bailing out."); return; } try { if (LuaState != null) { DeinitializeLua(); } LuaState = new LuaRuntime(); Logger.Info("Running Lua"); LuaState.MonoStackTraceWorkaround = true; LuaState.InitializeClrPackage(); using (var package = LuaState.Globals["package"] as LuaTable) { package["path"] = $"{Path.Combine(StockPath, "?.lua")};{Path.Combine(StockPath, "?/init.lua")}"; package["cpath"] = ""; } using (var stock_table = LuaState.CreateTable()) { stock_table["_VERSION"] = Assembly.GetExecutingAssembly().GetName().Version.ToString(); using (var func = LuaState.CreateFunctionFromDelegate( new Action <LuaTable, LuaFunction>(LuaFunctions.Hook) )) stock_table["hook"] = func; using (var func = LuaState.CreateFunctionFromDelegate( new Func <string, AssemblyHelper>(LuaFunctions.Assembly) )) stock_table["assembly"] = func; using (var func = LuaState.CreateFunctionFromDelegate( new LuaFunctions.ArrayTypeFuncDelegate(LuaFunctions.ArrayType) )) stock_table["array_type"] = func; using (var func = LuaState.CreateFunctionFromDelegate( new Func <Type, LuaTable, LuaClrTypeObject>(LuaFunctions.GenericType) )) stock_table["generic_type"] = func; using (var func = LuaState.CreateFunctionFromDelegate( new Func <LuaVararg, object>(LuaFunctions.Get) )) stock_table["get"] = func; using (var func = LuaState.CreateFunctionFromDelegate( new Action <LuaVararg>(LuaFunctions.Set) )) stock_table["set"] = func; LuaState.Globals["stock"] = stock_table; } LuaState.DoFile(StockMainLuaPath); using (var stock = LuaState.Globals["stock"]) { var stock_table = stock as LuaTable; if (stock_table != null) { var unload = stock_table["unload"]; if (!(unload is LuaFunction)) { unload.Dispose(); unload = null; } var ready = stock_table["ready"]; if (!(ready is LuaFunction)) { ready.Dispose(); ready = null; } if (unload != null) { Unload = unload as LuaFunction; } if (ready != null) { Ready = ready as LuaFunction; } } } } catch (LuaException e) { Logger.Error($"Failed initializing Lua: [{e.GetType()}]"); Logger.ErrorIndent(e.Message); foreach (var line in e.TracebackArray) { Logger.ErrorIndent(line); } } catch (Exception e) { Logger.Error($"Failed initializing Lua: [{e.GetType()}]"); Logger.ErrorIndent(e.Message); foreach (var line in e.StackTrace.Split('\n')) { Logger.ErrorIndent(line.Replace(" ", "")); } } if (_GameObject != null) { if (Ready != null) { SafeExecLua(Ready, "running stock.ready"); } } }
public void HugeResultList() { var range = Enumerable.Range(1, 1000); Func<LuaVararg> fn = () => new LuaVararg(range.Select(i => (LuaNumber)i), true); using (var runtime = new LuaRuntime()) { using (var f = runtime.CreateFunctionFromDelegate(fn)) { runtime.Globals["callback"] = f; } using (var results = runtime.DoString("return callback()")) { Assert.AreEqual(range.Sum(), results.Select(i => (int)i.ToNumber().Value).Sum()); } } }
public void ClrErrorPropagation() { Action thrower = () => { throw new LuaException("$TEST$"); }; using (var runtime = new LuaRuntime()) { using (var wrapper = runtime.CreateFunctionFromDelegate(thrower)) { runtime.Globals["callback"] = wrapper; } runtime.DoString("callback()"); } }