code: def _generate_cpy_function_decl(self, tp, name):
      assert isinstance(tp, model.FunctionPtrType)
      if tp.ellipsis:
          # cannot support vararg functions better than this: check for its
          # exact type (including the fixed arguments), and build it as a
          # constant function pointer (no CPython wrapper)
          self._generate_cpy_const(False, name, tp)
          return
      prnt = self._prnt
      numargs = len(tp.args)
      if numargs == 0:
          argname = "noarg"
      elif numargs == 1:
          argname = "arg0"
      else:
          argname = "args"
      prnt("static PyObject *")
      prnt("_cffi_f_%s(PyObject *self, PyObject *%s)" % (name, argname))
      prnt("{")
      #
      context = "argument of %s" % name
      for i, type in enumerate(tp.args):
          prnt("  %s;" % type.get_c_name(" x%d" % i, context))
      #
      localvars = set()
      freelines = set()
      for type in tp.args:
          self._extra_local_variables(type, localvars, freelines)
      for decl in sorted(localvars):
          prnt("  %s;" % (decl,))
      #
      if not isinstance(tp.result, model.VoidType):
          result_code = "result = "
          context = "result of %s" % name
          prnt("  %s;" % tp.result.get_c_name(" result", context))
          prnt("  PyObject *pyresult;")
      else:
          result_code = ""
      #
      if len(tp.args) > 1:
          rng = range(len(tp.args))
          for i in rng:
              prnt("  PyObject *arg%d;" % i)
          prnt()
          prnt(
              '  if (!PyArg_ParseTuple(args, "%s:%s", %s))'
              % (
                  "O" * numargs,
                  name,
                  ", ".join(["&arg%d" % i for i in rng]),
              )
          )
          prnt("    return NULL;")
      prnt()
      #
      for i, type in enumerate(tp.args):
          self._convert_funcarg_to_c(
              type, "arg%d" % i, "x%d" % i, "return NULL"
          )
          prnt()
      #
      prnt("  Py_BEGIN_ALLOW_THREADS")
      prnt("  _cffi_restore_errno();")
      prnt(
          "  { %s%s(%s); }"
          % (
              result_code,
              name,
              ", ".join(["x%d" % i for i in range(len(tp.args))]),
          )
      )
      prnt("  _cffi_save_errno();")
      prnt("  Py_END_ALLOW_THREADS")
      prnt()
      #
      prnt("  (void)self; /* unused */")
      if numargs == 0:
          prnt("  (void)noarg; /* unused */")
      if result_code:
          prnt(
              "  pyresult = %s;"
              % self._convert_expr_from_c(
                  tp.result, "result", "result type"
              )
          )
          for freeline in freelines:
              prnt("  " + freeline)
          prnt("  return pyresult;")
      else:
          for freeline in freelines:
              prnt("  " + freeline)
          prnt("  Py_INCREF(Py_None);")
          prnt("  return Py_None;")
      prnt("}")
      prnt()
  
imports: import sys
  from .None import model
  from .error import VerificationError
  from .None import _imp_emulation
label_desc: Use image node_id 20 for calling the VCPythonEngine obj's underlying member method code with example usage: obj._generate_cpy_function_decl(tp, name) without return types