1/*[clinic input] 2preserve 3[clinic start generated code]*/ 4 5PyDoc_STRVAR(func_new__doc__, 6"function(code, globals, name=None, argdefs=None, closure=None)\n" 7"--\n" 8"\n" 9"Create a function object.\n" 10"\n" 11" code\n" 12" a code object\n" 13" globals\n" 14" the globals dictionary\n" 15" name\n" 16" a string that overrides the name from the code object\n" 17" argdefs\n" 18" a tuple that specifies the default argument values\n" 19" closure\n" 20" a tuple that supplies the bindings for free variables"); 21 22static PyObject * 23func_new_impl(PyTypeObject *type, PyCodeObject *code, PyObject *globals, 24 PyObject *name, PyObject *defaults, PyObject *closure); 25 26static PyObject * 27func_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) 28{ 29 PyObject *return_value = NULL; 30 static const char * const _keywords[] = {"code", "globals", "name", "argdefs", "closure", NULL}; 31 static _PyArg_Parser _parser = {NULL, _keywords, "function", 0}; 32 PyObject *argsbuf[5]; 33 PyObject * const *fastargs; 34 Py_ssize_t nargs = PyTuple_GET_SIZE(args); 35 Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 2; 36 PyCodeObject *code; 37 PyObject *globals; 38 PyObject *name = Py_None; 39 PyObject *defaults = Py_None; 40 PyObject *closure = Py_None; 41 42 fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 2, 5, 0, argsbuf); 43 if (!fastargs) { 44 goto exit; 45 } 46 if (!PyObject_TypeCheck(fastargs[0], &PyCode_Type)) { 47 _PyArg_BadArgument("function", "argument 'code'", (&PyCode_Type)->tp_name, fastargs[0]); 48 goto exit; 49 } 50 code = (PyCodeObject *)fastargs[0]; 51 if (!PyDict_Check(fastargs[1])) { 52 _PyArg_BadArgument("function", "argument 'globals'", "dict", fastargs[1]); 53 goto exit; 54 } 55 globals = fastargs[1]; 56 if (!noptargs) { 57 goto skip_optional_pos; 58 } 59 if (fastargs[2]) { 60 name = fastargs[2]; 61 if (!--noptargs) { 62 goto skip_optional_pos; 63 } 64 } 65 if (fastargs[3]) { 66 defaults = fastargs[3]; 67 if (!--noptargs) { 68 goto skip_optional_pos; 69 } 70 } 71 closure = fastargs[4]; 72skip_optional_pos: 73 return_value = func_new_impl(type, code, globals, name, defaults, closure); 74 75exit: 76 return return_value; 77} 78/*[clinic end generated code: output=3d96afa3396e5c82 input=a9049054013a1b77]*/ 79