public Task <bool> Start(ILua lua, GetILuaFromLuaStatePointer lua_extructor, ModuleAssemblyLoadContext assembly_context) { TaskCompletionSource <bool> taskCompletion = new TaskCompletionSource <bool>(); try { lua.PushManagedClosure(l => { if (l.Top() != 0) { throw new Exception("Closure execution stack is non-empty."); } l.PushString(random); return(1); }, 0); lua.MCall(0, 1); string ret_string = lua.GetString(-1); lua.Pop(1); if (ret_string != random) { throw new Exception("Return string is incorrect."); } taskCompletion.TrySetResult(true); } catch (Exception e) { taskCompletion.TrySetException(new Exception[] { e }); } return(taskCompletion.Task); }
public Task <bool> Start(ILua lua, GetILuaFromLuaStatePointer lua_extructor, ModuleAssemblyLoadContext assembly_context) { TaskCompletionSource <bool> taskCompletion = new TaskCompletionSource <bool>(); try { lua.PushManagedClosure(lua => { throw new Exception(error_message); }, 0); lua.MCall(0, 0); throw new Exception("MCall hasn't caught an exception"); } catch (Exception e) { if (e is GmodLuaException && e.ToString().Contains(error_message)) { taskCompletion.TrySetResult(true); } else { taskCompletion.TrySetException(new Exception[] { e }); } } return(taskCompletion.Task); }
public Task <bool> Start(ILua lua, GetILuaFromLuaStatePointer lua_extructor, ModuleAssemblyLoadContext assembly_context) { TaskCompletionSource <bool> taskCompletion = new TaskCompletionSource <bool>(); try { lua.PushManagedClosure(lua => { if (lua.Top() != 3) { throw new Exception("Closure execution stack has incorect number of items."); } string one = lua.GetString(1); string two = lua.GetString(2); double three = lua.GetNumber(3); lua.Pop(3); lua.PushString(one + three); lua.PushString(three + two); if (lua.Top() != 2) { throw new Exception("Closure execution stack has incorrect number of items after executtion."); } return(2); }, 0); lua.PushString(random1); lua.PushString(random2); lua.PushNumber(random3); lua.MCall(3, 2); string ret_1 = lua.GetString(-2); string ret_2 = lua.GetString(-1); lua.Pop(2); if (ret_1 != random1 + random3) { throw new Exception("First return string is incorrect."); } if (ret_2 != random3 + random2) { throw new Exception("Second return string is incorrect."); } taskCompletion.TrySetResult(true); } catch (Exception e) { taskCompletion.TrySetException(new Exception[] { e }); } return(taskCompletion.Task); }
public Task <bool> Start(ILua lua, GetILuaFromLuaStatePointer lua_extructor, ModuleAssemblyLoadContext assembly_context) { TaskCompletionSource <bool> taskCompletion = new TaskCompletionSource <bool>(); try { int stack_state = lua.Top(); lua.PushString(random1); lua.PushString(random2); lua.PushManagedClosure(lua => { if (lua.Top() != 1) { throw new Exception("Managed closure execution stack has incorrect number of items"); } double num = lua.GetNumber(1); lua.Pop(1); string first = lua.GetString(GmodInterop.GetUpvalueIndex(1)); string second = lua.GetString(GmodInterop.GetUpvalueIndex(2)); lua.PushString(first + num + second); return(1); }, 2); if (lua.Top() != stack_state + 1) { throw new Exception("Wrong number of items left on the stack"); } lua.PushNumber(random3); lua.MCall(1, 1); string ret = lua.GetString(-1); lua.Pop(1); if (ret != random1 + random3 + random2) { throw new Exception("Return string is incorrect"); } taskCompletion.TrySetResult(true); } catch (Exception e) { taskCompletion.TrySetException(new Exception[] { e }); } return(taskCompletion.Task); }
public Task <bool> Start(ILua lua, GetILuaFromLuaStatePointer lua_extructor, ModuleAssemblyLoadContext assembly_context) { TaskCompletionSource <bool> taskCompletion = new TaskCompletionSource <bool>(); try { int lua_state = lua.Top(); lua.PushString(random); lua.PushManagedClosure(lua => { if (lua.Top() != 0) { throw new Exception("Managed closure execution stack is non-empty"); } string upvalue = lua.GetString(GmodInterop.GetUpvalueIndex(1)); lua.PushString(upvalue + upvalue); return(1); }, 1); if (lua.Top() != lua_state + 1) { throw new Exception("There is incorrect number of items on the Lua stack"); } lua.MCall(0, 1); string ret = lua.GetString(-1); lua.Pop(1); if (ret != random + random) { throw new Exception("Return string is incorrect"); } taskCompletion.TrySetResult(true); } catch (Exception e) { taskCompletion.TrySetException(new Exception[] { e }); } return(taskCompletion.Task); }