示例#1
0
        public void LoadProto(int idx)
        {
            var proto   = _stack.Closure.Proto.Protos[idx];
            var closure = Closure.NewLuaClosure(proto);

            _stack.Push(closure);

            for (var i = 0; i < proto.Upvalues.Length; i++)
            {
                var uvInfo = proto.Upvalues[i];
                int uvIdx  = uvInfo.Idx;
                if (uvInfo.Instack == 1)
                {
                    if (_stack.Openuvs == null)
                    {
                        _stack.Openuvs = new Dictionary <int, Upvalue>();
                    }

                    if (_stack.Openuvs.ContainsKey(uvIdx))
                    {
                        closure.Upvals[i] = _stack.Openuvs[uvIdx];
                    }
                    else
                    {
                        closure.Upvals[i] = new Upvalue(_stack, uvIdx);
                        _stack.Openuvs.Add(uvIdx, closure.Upvals[i]);
                    }
                }
                else
                {
                    closure.Upvals[i] = _stack.Closure.Upvals[uvIdx];
                }
            }
        }
示例#2
0
        public int Load(ref byte[] chunk, string chunkName, string mode)
        {
            var proto = BinaryChunk.Undump(chunk);
            var c     = Closure.NewLuaClosure(proto);

            _stack.Push(c);
            if (proto.Upvalues.Length > 0)
            {
                var env = Registry.Get(Constant.LUA_RIDX_GLOBALS);
                c.Upvals[0] = new Upvalue(env);
            }

            return(0);
        }