internal Method(MethodDeclarationInfo type, Class parent, AccessFlag flag, int index) { Parent = parent; AccessFlag = flag; Declaration = type; ConstantPoolIndex = index; }
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); } }
/// <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); }