protected static CodeBlock GenerateCallback(string proc, PInvokeHandler pinvokecall, Type returntype, List <Type> paramtypes, CodeBlock cb) { CodeBlock call = Ast.CodeBlock(proc, returntype); call.Parent = cb; int count = 0; List <Variable> pars = new List <Variable>(); foreach (Type t in paramtypes) { var name = SymbolTable.StringToId("arg" + count++); Variable var = Variable.Parameter(call, name, t); call.AddParameter(var); pars.Add(var); } Variable ret = returntype == typeof(void) ? null : Create(SymbolTable.StringToId("ret"), call, typeof(object)); List <Statement> stmts = new List <Statement>(); Expression[] arguments = new Expression[pars.Count]; for (int i = 0; i < pars.Count; i++) { arguments[i] = MakeConvertFrom(Ast.Read(pars[i]), paramtypes[i]); } var fficall = pinvokecall(arguments); if (ret == null) { stmts.Add(Ast.Statement(fficall)); } else { stmts.Add(Ast.Write(ret, fficall)); stmts.Add(Ast.Return(MakeConvertTo(Ast.Read(ret), returntype))); } call.Body = Ast.Block(stmts); return(call); }
protected static CodeBlock GenerateInvoke(string proc, PInvokeHandler pinvokecall, Type returntype, List<Type> paramtypes, CodeBlock cb) { CodeBlock call = Ast.CodeBlock(proc); call.Parent = cb; int count = 0; List<Variable> pars = new List<Variable>(); List<Variable> vars = new List<Variable>(); foreach (object t in paramtypes) { var name = SymbolTable.StringToId("arg" + count++); Variable var = Variable.Parameter(call, name, typeof(object)); call.AddParameter(var); pars.Add(var); } count = 0; foreach (Type t in paramtypes) { var name = SymbolTable.StringToId("par" + count++); Variable var = Create(name, call, t); vars.Add(var); } Variable ret = returntype == typeof(void) ? null : Create(SymbolTable.StringToId("ret"), call, returntype); List<Statement> stmts = new List<Statement>(); for (int i = 0; i < count; i++) { var s = Ast.Write(vars[i], MakeConvertTo(Ast.Read(pars[i]), paramtypes[i])); stmts.Add(s); } Expression[] arguments = new Expression[vars.Count]; for (int i = 0; i < vars.Count; i++) { arguments[i] = Ast.Read(vars[i]); } var fficall = pinvokecall(arguments); if (ret == null) { stmts.Add(Ast.Statement(fficall)); stmts.Add(Ast.Return(Ast.ReadField(null, Unspecified))); } else { stmts.Add(Ast.Write(ret, fficall)); stmts.Add(Ast.Return(MakeConvertFrom(Ast.Read(ret), returntype))); } call.Body = Ast.Block(stmts); return call; }