Example #1
0
        public void Add(ISledLuaVarBaseType luaVar)
        {
            if (luaVar == null)
            {
                return;
            }

            m_dictCustomWatches[luaVar] = WatchedVariableService.ReceivingWatchedCustomVariables;

            if (luaVar.DomNode.Is <SledLuaVarGlobalType>())
            {
                Globals.Add(luaVar.DomNode.As <SledLuaVarGlobalType>());
            }
            else if (luaVar.DomNode.Is <SledLuaVarLocalType>())
            {
                Locals.Add(luaVar.DomNode.As <SledLuaVarLocalType>());
            }
            else if (luaVar.DomNode.Is <SledLuaVarUpvalueType>())
            {
                Upvalues.Add(luaVar.DomNode.As <SledLuaVarUpvalueType>());
            }
            else if (luaVar.DomNode.Is <SledLuaVarEnvType>())
            {
                EnvVars.Add(luaVar.DomNode.As <SledLuaVarEnvType>());
            }
        }
Example #2
0
        public int InternUpvalue(string upvalueName)
        {
            if (upvalueName == null || upvalueName.Length < 1)
            {
                throw new Exception("upvalue名称不能为空");
            }
            if (InNotAffectMode)
            {
                return(0);
            }

            for (var i = 0; i < Upvalues.Count; i++)
            {
                var upvalueItem = Upvalues[i];
                if (upvalueItem.Name == upvalueName)
                {
                    return(i);
                }
            }

            var upvalue = new UvmUpvaldesc();

            upvalue.Name = upvalueName;

            // 从上级proto中查找是否存在对应的localvars,判断instack的值
            if (Parent != null)
            {
                var locvar = Parent.FindLocvar(upvalueName);
                if (locvar != null)
                {
                    upvalue.Instack = true;
                    upvalue.Name    = upvalueName;
                    upvalue.Idx     = locvar.SlotIndex;
                }
            }
            else
            {
                upvalue.Instack = false;
                upvalue.Name    = upvalueName;
            }
            if (!upvalue.Instack)
            {
                // 在上层proto的upvalues中找,没有找到就返回上层的 count(upvalues),因为上层proto需要增加新upvalue
                if (Parent == null)
                {
                    upvalue.Idx     = Upvalues.Count;
                    upvalue.Instack = true;
                }
                else
                {
                    var parentUpvalueIndex = Parent.InternUpvalue(upvalueName);
                    upvalue.Idx     = parentUpvalueIndex;
                    upvalue.Instack = false;
                }
            }
            Upvalues.Add(upvalue);
            return(Upvalues.Count - 1);
        }