private static IEnumerable<Error> ResolveArgs(Invoke inv, Procedure proc) { var errors = new List<Error>(); var p = new List<Variable>(); if (proc != null) p = proc.GetSpecifiedChildren<Variable>().Where(x => x.VarSemantics == VarType.Parameter).ToList(); var index = 0; foreach (var arg in inv.Args) { IType type; errors.AddRange(IdentifierResolver.ResloveIdentifierType(inv.GetParent(), arg, out type)); if (proc != null) { if (index >= p.Count) errors.Add(new Error(inv.GetSourceIdentifier(), inv.Name, string.Format(ErrorMessages.InvalidSignature, inv.Name.Text))); else { if (type.ToString() != p[index].Type.ToString()) errors.Add(new Error(inv.GetSourceIdentifier(), inv.Name, string.Format(ErrorMessages.InvalidSignature, inv.Name.Text))); } } index++; } return errors; }
private static void Emit(Procedure proc) { Source += "public static void " + proc.Name.Text + "("; EmitLocalParam(proc); Source += ")\n{\n"; EmitLocalVariable(proc); EmitBody(proc.GetSpecifiedChildren<Body>().First()); Source += "}\n"; }
private static void EmitProcedure(TypeBuilder tb, Procedure proc) { LocalSym = new Dictionary<Variable, LocalBuilder>(); var actual = proc.GetSpecifiedChildren<Variable>() .Where(x => x.VarSemantics == VarType.Parameter) .ToArray(); var methodBuilder = tb.DefineMethod(proc.Name.Text, MethodAttributes.Public, null, actual.Select(x => GetType(x.Type)).ToArray()); for (var i = 0; i < actual.Length; ++i) methodBuilder.DefineParameter(i + 1, ParameterAttributes.In, actual[i].Name.Text); var il = methodBuilder.GetILGenerator(); foreach (var variable in proc.GetSpecifiedChildren<Variable>() .Where(x => x.VarSemantics == VarType.Variable) .ToArray()) { var a = il.DeclareLocal(GetType(variable.Type)); LocalSym.Add(variable, a); } EmitBody(methodBuilder, proc.GetSpecifiedChildren<Body>().First()); il.Emit(OpCodes.Ret); }