public void LoadProto(int idx) { var subProto = LuaStack.Closure.Proto.Protos[idx]; var closure = new LuaClosure(subProto); LuaStack.Push(closure); for (int i = 0; i < subProto.UpValues.Length; i++) { var uvInfo = subProto.UpValues[i]; int uvIdx = uvInfo.Idx; if (uvInfo.InStack == 1) { if (LuaStack.Openuvs == null) { LuaStack.Openuvs = new Dictionary <int, LuaUpValue>(); } if (LuaStack.Openuvs.TryGetValue(uvIdx, out LuaUpValue openuv)) { closure.Upvals[i] = openuv; } else { closure.Upvals[i] = LuaUpValue.CreateOpen(LuaStack, uvIdx); LuaStack.Openuvs[uvIdx] = closure.Upvals[i]; } } else { closure.Upvals[i] = LuaStack.Closure.Upvals[uvIdx]; } } }
public void PushCSharpClosure(CSharpFunction f, int n) { var closure = new LuaClosure(f, n); for (int i = n - 1; i >= 0; i--) { var val = LuaStack.Pop(); closure.Upvals[i] = LuaUpValue.CreateClosed(val); } LuaStack.Push(closure); }
private void CallLuaClosure(int nArgs, int nResults, LuaClosure c) { int nRegs = c.Proto.MaxStackSize; int nParams = c.Proto.NumParams; bool isVararg = c.Proto.IsVararg == 1; var newStack = new LuaStack(nRegs + 20, this) { Closure = c }; LuaValue[] funcAndArgs = LuaStack.PopN(nArgs + 1); newStack.PushN(funcAndArgs[1..], nParams);
public ErrState Load(byte[] chunk, string chunkName, string mode) { var proto = Prototype.Undump(chunk); var c = new LuaClosure(proto); LuaStack.Push(c); if (proto.UpValues != null && proto.UpValues.Length > 0) { var env = Registry.Get(Consts.LUA_RIDX_GLOBALS); c.Upvals[0] = LuaUpValue.CreateClosed(env); } return(ErrState.Ok); }
private void CallCSharpClosure(int nArgs, int nResults, LuaClosure c) { var newStack = new LuaStack(nArgs + 20, this) { Closure = c }; var args = LuaStack.PopN(nArgs); newStack.PushN(args, nArgs); LuaStack.Pop(); PushLuaStack(newStack); int r = c.CSharpFunc.Invoke(this); PopLuaStack(); if (nResults != 0) { var results = newStack.PopN(r); LuaStack.Check(nResults); LuaStack.PushN(results, nResults); } }