示例#1
0
 internal Method(MethodDeclarationInfo type, Class parent, AccessFlag flag, int index)
 {
     Parent            = parent;
     AccessFlag        = flag;
     Declaration       = type;
     ConstantPoolIndex = index;
 }
示例#2
0
 public bool Equivalent(MethodDeclarationInfo info)
 {
     if ((ReturnType == null && info.ReturnType == null) ||
         ReturnType.Equivalent(info.ReturnType) && Params.Count == info.Params.Count)
     {
         foreach ((VariableType p1, VariableType p2) in Params.Zip(info.Params))
         {
             if (!p1.Equivalent(p2))
             {
                 return(false);
             }
         }
         return(true);
     }
     else
     {
         return(false);
     }
 }
示例#3
0
        /// <summary>
        /// API使用这个函数添加method
        /// </summary>
        /// <param name="name"></param>
        /// <param name="decl"></param>
        /// <param name="flag"></param>
        /// <param name="index"></param>
        /// <returns></returns>
        internal Method AddMethod(string name, MethodDeclarationInfo decl, AccessFlag flag, int index)
        {
            if (Fields.ContainsKey(name))
            {
                throw new XiVMError($"Dupilcate Name {name} in class {Name}");
            }

            Method function = new Method(decl, this, flag, index);

            if (Methods.TryGetValue(name, out List <Method> value))
            {
                foreach (Method m in value)
                {
                    if (m.Declaration.Equivalent(decl))
                    {
                        // 重复定义
                        throw new XiVMError($"Duplicate definition for {Name}.{name}");
                    }
                }
                value.Add(function);
            }
            else
            {
                Methods.Add(name, new List <Method>()
                {
                    function
                });
            }

            // 添加参数
            int offset = 0;

            if (flag.IsStatic)
            {
                function.Params = new Variable[function.Declaration.Params.Count];
                for (int i = function.Declaration.Params.Count - 1; i >= 0; --i)
                {
                    offset            -= function.Declaration.Params[i].SlotSize;
                    function.Params[i] = new Variable(function.Declaration.Params[i])
                    {
                        Offset = offset
                    };
                }
            }
            else
            {
                function.Params = new Variable[function.Declaration.Params.Count + 1];
                for (int i = function.Declaration.Params.Count - 1; i >= 0; --i)
                {
                    offset -= function.Declaration.Params[i].SlotSize;
                    function.Params[i + 1] = new Variable(function.Declaration.Params[i])
                    {
                        Offset = offset
                    };
                }
                // 成员方法默认参数this
                offset            -= VariableType.AddressType.SlotSize;
                function.Params[0] = new Variable(ObjectType)
                {
                    Offset = offset
                };
            }

            return(function);
        }