示例#1
0
        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;
    }