diff -r 8feb6a5ce4c6 Modules/_decimal/_decimal.c --- a/Modules/_decimal/_decimal.c Wed Jan 25 23:33:27 2017 +0100 +++ b/Modules/_decimal/_decimal.c Fri Jan 27 16:25:26 2017 +0100 @@ -4335,9 +4335,10 @@ Dec_BinaryFuncVA(mpd_qscaleb) Dec_BinaryFuncVA(mpd_qshift) static PyObject * -dec_mpd_qquantize(PyObject *v, PyObject *args, PyObject *kwds) -{ - static char *kwlist[] = {"exp", "rounding", "context", NULL}; +dec_mpd_qquantize(PyObject *v, PyObject **args, Py_ssize_t nargs, PyObject *kwnames) +{ + static const char * const kwlist[] = {"exp", "rounding", "context", NULL}; + static _PyArg_Parser parser = {"O|OO", kwlist, 0}; PyObject *rounding = Py_None; PyObject *context = Py_None; PyObject *w, *a, *b; @@ -4345,8 +4346,8 @@ dec_mpd_qquantize(PyObject *v, PyObject uint32_t status = 0; mpd_context_t workctx; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|OO", kwlist, - &w, &rounding, &context)) { + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &parser, + &w, &rounding, &context)) { return NULL; } CONTEXT_CHECK_VA(context); @@ -4751,7 +4752,7 @@ static PyMethodDef dec_methods [] = { "min", (PyCFunction)dec_mpd_qmin, METH_VARARGS|METH_KEYWORDS, doc_min }, { "min_mag", (PyCFunction)dec_mpd_qmin_mag, METH_VARARGS|METH_KEYWORDS, doc_min_mag }, { "next_toward", (PyCFunction)dec_mpd_qnext_toward, METH_VARARGS|METH_KEYWORDS, doc_next_toward }, - { "quantize", (PyCFunction)dec_mpd_qquantize, METH_VARARGS|METH_KEYWORDS, doc_quantize }, + { "quantize", (PyCFunction)dec_mpd_qquantize, METH_FASTCALL, doc_quantize }, { "remainder_near", (PyCFunction)dec_mpd_qrem_near, METH_VARARGS|METH_KEYWORDS, doc_remainder_near }, /* Ternary arithmetic functions, optional context arg */ @@ -4933,14 +4934,18 @@ ctx_##MPDFUNC(PyObject *context, PyObjec /* Binary context method. */ #define DecCtx_BinaryFunc(MPDFUNC) \ static PyObject * \ -ctx_##MPDFUNC(PyObject *context, PyObject *args) \ +ctx_##MPDFUNC(PyObject *context, PyObject **args, Py_ssize_t nargs, PyObject *kwnames) \ { \ PyObject *v, *w; \ PyObject *a, *b; \ PyObject *result; \ uint32_t status = 0; \ \ - if (!PyArg_ParseTuple(args, "OO", &v, &w)) { \ + if (!_PyArg_NoStackKeywords(#MPDFUNC, kwnames)) { \ + return NULL; \ + } \ + \ + if (!_PyArg_UnpackStack(args, nargs, #MPDFUNC, 2, 2, &v, &w)) { \ return NULL; \ } \ \ @@ -5419,22 +5424,22 @@ static PyMethodDef context_methods [] = { "sqrt", ctx_mpd_qsqrt, METH_O, doc_ctx_sqrt }, /* Binary arithmetic functions */ - { "add", ctx_mpd_qadd, METH_VARARGS, doc_ctx_add }, - { "compare", ctx_mpd_qcompare, METH_VARARGS, doc_ctx_compare }, - { "compare_signal", ctx_mpd_qcompare_signal, METH_VARARGS, doc_ctx_compare_signal }, - { "divide", ctx_mpd_qdiv, METH_VARARGS, doc_ctx_divide }, - { "divide_int", ctx_mpd_qdivint, METH_VARARGS, doc_ctx_divide_int }, + { "add", (PyCFunction)ctx_mpd_qadd, METH_FASTCALL, doc_ctx_add }, + { "compare", (PyCFunction)ctx_mpd_qcompare, METH_FASTCALL, doc_ctx_compare }, + { "compare_signal", (PyCFunction)ctx_mpd_qcompare_signal, METH_FASTCALL, doc_ctx_compare_signal }, + { "divide", (PyCFunction)ctx_mpd_qdiv, METH_FASTCALL, doc_ctx_divide }, + { "divide_int", (PyCFunction)ctx_mpd_qdivint, METH_FASTCALL, doc_ctx_divide_int }, { "divmod", ctx_mpd_qdivmod, METH_VARARGS, doc_ctx_divmod }, - { "max", ctx_mpd_qmax, METH_VARARGS, doc_ctx_max }, - { "max_mag", ctx_mpd_qmax_mag, METH_VARARGS, doc_ctx_max_mag }, - { "min", ctx_mpd_qmin, METH_VARARGS, doc_ctx_min }, - { "min_mag", ctx_mpd_qmin_mag, METH_VARARGS, doc_ctx_min_mag }, - { "multiply", ctx_mpd_qmul, METH_VARARGS, doc_ctx_multiply }, - { "next_toward", ctx_mpd_qnext_toward, METH_VARARGS, doc_ctx_next_toward }, - { "quantize", ctx_mpd_qquantize, METH_VARARGS, doc_ctx_quantize }, - { "remainder", ctx_mpd_qrem, METH_VARARGS, doc_ctx_remainder }, - { "remainder_near", ctx_mpd_qrem_near, METH_VARARGS, doc_ctx_remainder_near }, - { "subtract", ctx_mpd_qsub, METH_VARARGS, doc_ctx_subtract }, + { "max", (PyCFunction)ctx_mpd_qmax, METH_FASTCALL, doc_ctx_max }, + { "max_mag", (PyCFunction)ctx_mpd_qmax_mag, METH_FASTCALL, doc_ctx_max_mag }, + { "min", (PyCFunction)ctx_mpd_qmin, METH_FASTCALL, doc_ctx_min }, + { "min_mag", (PyCFunction)ctx_mpd_qmin_mag, METH_FASTCALL, doc_ctx_min_mag }, + { "multiply", (PyCFunction)ctx_mpd_qmul, METH_FASTCALL, doc_ctx_multiply }, + { "next_toward", (PyCFunction)ctx_mpd_qnext_toward, METH_FASTCALL, doc_ctx_next_toward }, + { "quantize", (PyCFunction)ctx_mpd_qquantize, METH_FASTCALL, doc_ctx_quantize }, + { "remainder", (PyCFunction)ctx_mpd_qrem, METH_FASTCALL, doc_ctx_remainder }, + { "remainder_near", (PyCFunction)ctx_mpd_qrem_near, METH_FASTCALL, doc_ctx_remainder_near }, + { "subtract", (PyCFunction)ctx_mpd_qsub, METH_FASTCALL, doc_ctx_subtract }, /* Binary or ternary arithmetic functions */ { "power", (PyCFunction)ctx_mpd_qpow, METH_VARARGS|METH_KEYWORDS, doc_ctx_power }, @@ -5478,13 +5483,13 @@ static PyMethodDef context_methods [] = { "compare_total", ctx_mpd_compare_total, METH_VARARGS, doc_ctx_compare_total }, { "compare_total_mag", ctx_mpd_compare_total_mag, METH_VARARGS, doc_ctx_compare_total_mag }, { "copy_sign", ctx_mpd_qcopy_sign, METH_VARARGS, doc_ctx_copy_sign }, - { "logical_and", ctx_mpd_qand, METH_VARARGS, doc_ctx_logical_and }, - { "logical_or", ctx_mpd_qor, METH_VARARGS, doc_ctx_logical_or }, - { "logical_xor", ctx_mpd_qxor, METH_VARARGS, doc_ctx_logical_xor }, - { "rotate", ctx_mpd_qrotate, METH_VARARGS, doc_ctx_rotate }, + { "logical_and", (PyCFunction)ctx_mpd_qand, METH_FASTCALL, doc_ctx_logical_and }, + { "logical_or", (PyCFunction)ctx_mpd_qor, METH_FASTCALL, doc_ctx_logical_or }, + { "logical_xor", (PyCFunction)ctx_mpd_qxor, METH_FASTCALL, doc_ctx_logical_xor }, + { "rotate", (PyCFunction)ctx_mpd_qrotate, METH_FASTCALL, doc_ctx_rotate }, { "same_quantum", ctx_mpd_same_quantum, METH_VARARGS, doc_ctx_same_quantum }, - { "scaleb", ctx_mpd_qscaleb, METH_VARARGS, doc_ctx_scaleb }, - { "shift", ctx_mpd_qshift, METH_VARARGS, doc_ctx_shift }, + { "scaleb", (PyCFunction)ctx_mpd_qscaleb, METH_FASTCALL, doc_ctx_scaleb }, + { "shift", (PyCFunction)ctx_mpd_qshift, METH_FASTCALL, doc_ctx_shift }, /* Set context values */ { "clear_flags", context_clear_flags, METH_NOARGS, doc_ctx_clear_flags },