diff -r 82d1c8d15e18 Include/ceval.h --- a/Include/ceval.h Mon Feb 06 10:41:46 2017 +0200 +++ b/Include/ceval.h Mon Feb 06 10:27:12 2017 +0100 @@ -79,8 +79,8 @@ PyAPI_FUNC(void) Py_SetRecursionLimit(in PyAPI_FUNC(int) Py_GetRecursionLimit(void); #define Py_EnterRecursiveCall(where) \ - (_Py_MakeRecCheck(PyThreadState_GET()->recursion_depth) && \ - _Py_CheckRecursiveCall(where)) + (_Py_unlikely(_Py_MakeRecCheck(PyThreadState_GET()->recursion_depth) \ + && _Py_CheckRecursiveCall(where))) #define Py_LeaveRecursiveCall() \ do{ if(_Py_MakeEndRecCheck(PyThreadState_GET()->recursion_depth)) \ PyThreadState_GET()->overflowed = 0; \ diff -r 82d1c8d15e18 Include/modsupport.h --- a/Include/modsupport.h Mon Feb 06 10:41:46 2017 +0200 +++ b/Include/modsupport.h Mon Feb 06 10:27:12 2017 +0100 @@ -63,11 +63,14 @@ PyAPI_FUNC(int) _PyArg_NoKeywords(const PyAPI_FUNC(int) _PyArg_NoStackKeywords(const char *funcname, PyObject *kwnames); PyAPI_FUNC(int) _PyArg_NoPositional(const char *funcname, PyObject *args); #define _PyArg_NoKeywords(funcname, kwargs) \ - ((kwargs) == NULL || _PyArg_NoKeywords((funcname), (kwargs))) + (_Py_unlikely((kwargs) == NULL) \ + || _PyArg_NoKeywords((funcname), (kwargs))) #define _PyArg_NoStackKeywords(funcname, kwnames) \ - ((kwnames) == NULL || _PyArg_NoStackKeywords((funcname), (kwnames))) + (_Py_unlikely((kwnames) == NULL) \ + || _PyArg_NoStackKeywords((funcname), (kwnames))) #define _PyArg_NoPositional(funcname, args) \ - ((args) == NULL || _PyArg_NoPositional((funcname), (args))) + (_Py_unlikely((args) == NULL) \ + || _PyArg_NoPositional((funcname), (args))) #endif diff -r 82d1c8d15e18 Include/object.h --- a/Include/object.h Mon Feb 06 10:41:46 2017 +0200 +++ b/Include/object.h Mon Feb 06 10:27:12 2017 +0100 @@ -788,7 +788,7 @@ PyAPI_FUNC(void) _Py_Dealloc(PyObject *) do { \ PyObject *_py_decref_tmp = (PyObject *)(op); \ if (_Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA \ - --(_py_decref_tmp)->ob_refcnt != 0) \ + _Py_unlikely(--(_py_decref_tmp)->ob_refcnt != 0)) \ _Py_CHECK_REFCNT(_py_decref_tmp) \ else \ _Py_Dealloc(_py_decref_tmp); \ diff -r 82d1c8d15e18 Include/pyport.h --- a/Include/pyport.h Mon Feb 06 10:41:46 2017 +0200 +++ b/Include/pyport.h Mon Feb 06 10:27:12 2017 +0100 @@ -521,6 +521,28 @@ extern "C" { #define _Py_HOT_FUNCTION #endif +/* _Py_likely(test) and _Py_unlikely() macros can be used to provide the + compiler with branch prediction information. In general, you should prefer + to use actual profile feedback for this (PGO compilation, enabled by + ./configure --with-optimizations), as programmers are notoriously bad at + predicting how their programs actually perform. However, there are + applications in which this data is hard to collect. + + Example to indicate that we expect that tp_init is set (is not NULL): + + if (_Py_likely(tp_init != NULL)) { ... use tp_init ... } + + Example to indicate that we expect that kwargs is NULL: + + if (_Py_unlikely(kwargs != NULL)) { ... error ... } */ +#if defined(__GNUC__) || defined(__clang__) +# define _Py_likely(test) __builtin_expect(!!(test), 1) +# define _Py_unlikely(test) __builtin_expect(!!(test), 0) +#else +# define _Py_likely(test) (!!(test)) +# define _Py_unlikely(test) (!!(test)) +#endif + /* _Py_NO_INLINE * Disable inlining on a function. For example, it helps to reduce the C stack * consumption. diff -r 82d1c8d15e18 Objects/abstract.c --- a/Objects/abstract.c Mon Feb 06 10:41:46 2017 +0200 +++ b/Objects/abstract.c Mon Feb 06 10:27:12 2017 +0100 @@ -2186,7 +2186,7 @@ PyObject* assert((callable != NULL) ^ (where != NULL)); if (result == NULL) { - if (!err_occurred) { + if (_Py_unlikely(!err_occurred)) { if (callable) PyErr_Format(PyExc_SystemError, "%R returned NULL without setting an error", @@ -2203,7 +2203,7 @@ PyObject* } } else { - if (err_occurred) { + if (_Py_unlikely(err_occurred)) { Py_DECREF(result); if (callable) { @@ -2265,7 +2265,7 @@ PyObject* _Py_NO_INLINE Py_ssize_t i; args = PyTuple_New(nargs); - if (args == NULL) { + if (_Py_unlikely(args == NULL)) { return NULL; } @@ -2333,14 +2333,14 @@ PyObject * /* Slow-path: build a temporary tuple */ call = callable->ob_type->tp_call; - if (call == NULL) { + if (_Py_unlikely(call == NULL)) { PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable", callable->ob_type->tp_name); goto exit; } tuple = _PyStack_AsTuple(args, nargs); - if (tuple == NULL) { + if (_Py_unlikely(tuple == NULL)) { goto exit; } @@ -2406,7 +2406,7 @@ PyObject * assert(kwnames != NULL); nkwargs = PyTuple_GET_SIZE(kwnames); kwdict = _PyDict_NewPresized(nkwargs); - if (kwdict == NULL) { + if (_Py_unlikely(kwdict == NULL)) { return NULL; } @@ -2414,7 +2414,7 @@ PyObject * PyObject *key = PyTuple_GET_ITEM(kwnames, i); PyObject *value = *values++; /* If key already exists, replace it with the new value */ - if (PyDict_SetItem(kwdict, key, value)) { + if (_Py_unlikely(PyDict_SetItem(kwdict, key, value))) { Py_DECREF(kwdict); return NULL; } @@ -2519,20 +2519,20 @@ PyObject * } call = callable->ob_type->tp_call; - if (call == NULL) { + if (_Py_unlikely(call == NULL)) { PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable", callable->ob_type->tp_name); goto exit; } argtuple = _PyStack_AsTuple(stack, nargs); - if (argtuple == NULL) { + if (_Py_unlikely(argtuple == NULL)) { goto exit; } if (nkwargs > 0) { kwdict = _PyStack_AsDict(stack + nargs, kwnames); - if (kwdict == NULL) { + if (_Py_unlikely(kwdict == NULL)) { Py_DECREF(argtuple); goto exit; } diff -r 82d1c8d15e18 Objects/clinic/unicodeobject.c.h --- a/Objects/clinic/unicodeobject.c.h Mon Feb 06 10:41:46 2017 +0200 +++ b/Objects/clinic/unicodeobject.c.h Mon Feb 06 10:27:12 2017 +0100 @@ -83,8 +83,8 @@ unicode_center(PyObject *self, PyObject Py_ssize_t width; Py_UCS4 fillchar = ' '; - if (!_PyArg_ParseStack(args, nargs, "n|O&:center", - &width, convert_uc, &fillchar)) { + if (_Py_unlikely(!_PyArg_ParseStack(args, nargs, "n|O&:center", + &width, convert_uc, &fillchar))) { goto exit; } @@ -435,8 +435,8 @@ unicode_ljust(PyObject *self, PyObject * Py_ssize_t width; Py_UCS4 fillchar = ' '; - if (!_PyArg_ParseStack(args, nargs, "n|O&:ljust", - &width, convert_uc, &fillchar)) { + if (_Py_unlikely(!_PyArg_ParseStack(args, nargs, "n|O&:ljust", + &width, convert_uc, &fillchar))) { goto exit; } @@ -487,9 +487,9 @@ unicode_strip(PyObject *self, PyObject * PyObject *return_value = NULL; PyObject *chars = Py_None; - if (!_PyArg_UnpackStack(args, nargs, "strip", + if (_Py_unlikely(!_PyArg_UnpackStack(args, nargs, "strip", 0, 1, - &chars)) { + &chars))) { goto exit; } @@ -522,9 +522,9 @@ unicode_lstrip(PyObject *self, PyObject PyObject *return_value = NULL; PyObject *chars = NULL; - if (!_PyArg_UnpackStack(args, nargs, "lstrip", + if (_Py_unlikely(!_PyArg_UnpackStack(args, nargs, "lstrip", 0, 1, - &chars)) { + &chars))) { goto exit; } @@ -557,9 +557,9 @@ unicode_rstrip(PyObject *self, PyObject PyObject *return_value = NULL; PyObject *chars = NULL; - if (!_PyArg_UnpackStack(args, nargs, "rstrip", + if (_Py_unlikely(!_PyArg_UnpackStack(args, nargs, "rstrip", 0, 1, - &chars)) { + &chars))) { goto exit; } @@ -600,8 +600,8 @@ unicode_replace(PyObject *self, PyObject PyObject *new; Py_ssize_t count = -1; - if (!_PyArg_ParseStack(args, nargs, "UU|n:replace", - &old, &new, &count)) { + if (_Py_unlikely(!_PyArg_ParseStack(args, nargs, "UU|n:replace", + &old, &new, &count))) { goto exit; } @@ -635,8 +635,8 @@ unicode_rjust(PyObject *self, PyObject * Py_ssize_t width; Py_UCS4 fillchar = ' '; - if (!_PyArg_ParseStack(args, nargs, "n|O&:rjust", - &width, convert_uc, &fillchar)) { + if (_Py_unlikely(!_PyArg_ParseStack(args, nargs, "n|O&:rjust", + &width, convert_uc, &fillchar))) { goto exit; } @@ -840,8 +840,8 @@ unicode_maketrans(void *null, PyObject * PyObject *y = NULL; PyObject *z = NULL; - if (!_PyArg_ParseStack(args, nargs, "O|UU:maketrans", - &x, &y, &z)) { + if (_Py_unlikely(!_PyArg_ParseStack(args, nargs, "O|UU:maketrans", + &x, &y, &z))) { goto exit; } @@ -962,4 +962,4 @@ unicode_sizeof(PyObject *self, PyObject { return unicode_sizeof_impl(self); } -/*[clinic end generated code: output=88b06f61edd282f9 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=294a5e2489e94722 input=a9049054013a1b77]*/ diff -r 82d1c8d15e18 Objects/descrobject.c --- a/Objects/descrobject.c Mon Feb 06 10:41:46 2017 +0200 +++ b/Objects/descrobject.c Mon Feb 06 10:27:12 2017 +0100 @@ -257,7 +257,7 @@ PyObject * PyObject *self, *result; /* Make sure that the first argument is acceptable as 'self' */ - if (nargs < 1) { + if (_Py_unlikely(nargs < 1)) { PyErr_Format(PyExc_TypeError, "descriptor '%V' of '%.100s' " "object needs an argument", @@ -266,8 +266,9 @@ PyObject * return NULL; } self = args[0]; - if (!_PyObject_RealIsSubclass((PyObject *)Py_TYPE(self), - (PyObject *)PyDescr_TYPE(descr))) { + if (!_Py_unlikely(_PyObject_RealIsSubclass( + (PyObject *)Py_TYPE(self), + (PyObject *)PyDescr_TYPE(descr)))) { PyErr_Format(PyExc_TypeError, "descriptor '%V' " "requires a '%.100s' object " diff -r 82d1c8d15e18 Objects/methodobject.c --- a/Objects/methodobject.c Mon Feb 06 10:41:46 2017 +0200 +++ b/Objects/methodobject.c Mon Feb 06 10:27:12 2017 +0100 @@ -237,14 +237,14 @@ PyObject * switch (flags) { case METH_NOARGS: - if (nargs != 0) { + if (_Py_unlikely(nargs != 0)) { PyErr_Format(PyExc_TypeError, "%.200s() takes no arguments (%zd given)", method->ml_name, nargs); return NULL; } - if (nkwargs) { + if (_Py_unlikely(nkwargs)) { goto no_keyword_error; } @@ -252,14 +252,14 @@ PyObject * break; case METH_O: - if (nargs != 1) { + if (_Py_unlikely(nargs != 1)) { PyErr_Format(PyExc_TypeError, "%.200s() takes exactly one argument (%zd given)", method->ml_name, nargs); return NULL; } - if (nkwargs) { + if (_Py_unlikely(nkwargs)) { goto no_keyword_error; } @@ -278,21 +278,21 @@ PyObject * and a temporary dict for keyword arguments */ PyObject *argtuple; - if (!(flags & METH_KEYWORDS) && nkwargs) { + if (!(flags & METH_KEYWORDS) && _Py_unlikely(nkwargs)) { goto no_keyword_error; } argtuple = _PyStack_AsTuple(args, nargs); - if (argtuple == NULL) { + if (_Py_unlikely(argtuple == NULL)) { return NULL; } if (flags & METH_KEYWORDS) { PyObject *kwdict; - if (nkwargs > 0) { + if (_Py_unlikely(nkwargs > 0)) { kwdict = _PyStack_AsDict(args + nargs, kwnames); - if (kwdict == NULL) { + if (_Py_unlikely(kwdict == NULL)) { Py_DECREF(argtuple); return NULL; } diff -r 82d1c8d15e18 Python/bltinmodule.c --- a/Python/bltinmodule.c Mon Feb 06 10:41:46 2017 +0200 +++ b/Python/bltinmodule.c Mon Feb 06 10:27:12 2017 +0100 @@ -1483,7 +1483,7 @@ builtin_len(PyObject *module, PyObject * Py_ssize_t res; res = PyObject_Size(obj); - if (res < 0 && PyErr_Occurred()) + if (_Py_unlikely(res < 0) && PyErr_Occurred()) return NULL; return PyLong_FromSsize_t(res); } diff -r 82d1c8d15e18 Python/ceval.c --- a/Python/ceval.c Mon Feb 06 10:41:46 2017 +0200 +++ b/Python/ceval.c Mon Feb 06 10:27:12 2017 +0100 @@ -4946,7 +4946,7 @@ fast_function(PyObject *func, PyObject * PyObject *argdefs = PyFunction_GET_DEFAULTS(func); PyObject *kwdefs, *closure, *name, *qualname; PyObject **d; - Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames); + Py_ssize_t nkwargs = _Py_likely(kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames); Py_ssize_t nd; assert(PyFunction_Check(func)); @@ -5035,8 +5035,8 @@ PyObject * } } - nk = (kwargs != NULL) ? PyDict_GET_SIZE(kwargs) : 0; - if (nk != 0) { + nk = _Py_unlikely(kwargs != NULL) ? PyDict_GET_SIZE(kwargs) : 0; + if (_Py_unlikely(nk != 0)) { Py_ssize_t pos, i; /* Issue #29318: Caller and callee functions must not share the diff -r 82d1c8d15e18 Python/clinic/bltinmodule.c.h --- a/Python/clinic/bltinmodule.c.h Mon Feb 06 10:41:46 2017 +0200 +++ b/Python/clinic/bltinmodule.c.h Mon Feb 06 10:27:12 2017 +0100 @@ -92,8 +92,8 @@ builtin_format(PyObject *module, PyObjec PyObject *value; PyObject *format_spec = NULL; - if (!_PyArg_ParseStack(args, nargs, "O|U:format", - &value, &format_spec)) { + if (_Py_unlikely(!_PyArg_ParseStack(args, nargs, "O|U:format", + &value, &format_spec))) { goto exit; } @@ -201,9 +201,9 @@ builtin_divmod(PyObject *module, PyObjec PyObject *x; PyObject *y; - if (!_PyArg_UnpackStack(args, nargs, "divmod", + if (_Py_unlikely(!_PyArg_UnpackStack(args, nargs, "divmod", 2, 2, - &x, &y)) { + &x, &y))) { goto exit; } @@ -243,9 +243,9 @@ builtin_eval(PyObject *module, PyObject PyObject *globals = Py_None; PyObject *locals = Py_None; - if (!_PyArg_UnpackStack(args, nargs, "eval", + if (_Py_unlikely(!_PyArg_UnpackStack(args, nargs, "eval", 1, 3, - &source, &globals, &locals)) { + &source, &globals, &locals))) { goto exit; } @@ -285,9 +285,9 @@ builtin_exec(PyObject *module, PyObject PyObject *globals = Py_None; PyObject *locals = Py_None; - if (!_PyArg_UnpackStack(args, nargs, "exec", + if (_Py_unlikely(!_PyArg_UnpackStack(args, nargs, "exec", 1, 3, - &source, &globals, &locals)) { + &source, &globals, &locals))) { goto exit; } @@ -342,9 +342,9 @@ builtin_hasattr(PyObject *module, PyObje PyObject *obj; PyObject *name; - if (!_PyArg_UnpackStack(args, nargs, "hasattr", + if (_Py_unlikely(!_PyArg_UnpackStack(args, nargs, "hasattr", 2, 2, - &obj, &name)) { + &obj, &name))) { goto exit; } @@ -392,9 +392,9 @@ builtin_setattr(PyObject *module, PyObje PyObject *name; PyObject *value; - if (!_PyArg_UnpackStack(args, nargs, "setattr", + if (_Py_unlikely(!_PyArg_UnpackStack(args, nargs, "setattr", 3, 3, - &obj, &name, &value)) { + &obj, &name, &value))) { goto exit; } @@ -428,9 +428,9 @@ builtin_delattr(PyObject *module, PyObje PyObject *obj; PyObject *name; - if (!_PyArg_UnpackStack(args, nargs, "delattr", + if (_Py_unlikely(!_PyArg_UnpackStack(args, nargs, "delattr", 2, 2, - &obj, &name)) { + &obj, &name))) { goto exit; } @@ -542,9 +542,9 @@ builtin_pow(PyObject *module, PyObject * PyObject *y; PyObject *z = Py_None; - if (!_PyArg_UnpackStack(args, nargs, "pow", + if (_Py_unlikely(!_PyArg_UnpackStack(args, nargs, "pow", 2, 3, - &x, &y, &z)) { + &x, &y, &z))) { goto exit; } @@ -581,9 +581,9 @@ builtin_input(PyObject *module, PyObject PyObject *return_value = NULL; PyObject *prompt = NULL; - if (!_PyArg_UnpackStack(args, nargs, "input", + if (_Py_unlikely(!_PyArg_UnpackStack(args, nargs, "input", 0, 1, - &prompt)) { + &prompt))) { goto exit; } @@ -630,9 +630,9 @@ builtin_sum(PyObject *module, PyObject * PyObject *iterable; PyObject *start = NULL; - if (!_PyArg_UnpackStack(args, nargs, "sum", + if (_Py_unlikely(!_PyArg_UnpackStack(args, nargs, "sum", 1, 2, - &iterable, &start)) { + &iterable, &start))) { goto exit; } @@ -669,9 +669,9 @@ builtin_isinstance(PyObject *module, PyO PyObject *obj; PyObject *class_or_tuple; - if (!_PyArg_UnpackStack(args, nargs, "isinstance", + if (_Py_unlikely(!_PyArg_UnpackStack(args, nargs, "isinstance", 2, 2, - &obj, &class_or_tuple)) { + &obj, &class_or_tuple))) { goto exit; } @@ -708,9 +708,9 @@ builtin_issubclass(PyObject *module, PyO PyObject *cls; PyObject *class_or_tuple; - if (!_PyArg_UnpackStack(args, nargs, "issubclass", + if (_Py_unlikely(!_PyArg_UnpackStack(args, nargs, "issubclass", 2, 2, - &cls, &class_or_tuple)) { + &cls, &class_or_tuple))) { goto exit; } @@ -722,4 +722,4 @@ builtin_issubclass(PyObject *module, PyO exit: return return_value; } -/*[clinic end generated code: output=3234725ef4d8bbf1 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=7cad436471be2881 input=a9049054013a1b77]*/ diff -r 82d1c8d15e18 Python/getargs.c --- a/Python/getargs.c Mon Feb 06 10:41:46 2017 +0200 +++ b/Python/getargs.c Mon Feb 06 10:27:12 2017 +0100 @@ -282,9 +282,10 @@ vgetargs1_impl(PyObject *compat_args, Py if (level == 0) max++; level++; - if (level >= 30) + if (_Py_unlikely(level >= 30)) { Py_FatalError("too many tuple nesting levels " "in argument format string"); + } break; case ')': if (level == 0) @@ -317,8 +318,9 @@ vgetargs1_impl(PyObject *compat_args, Py } } - if (level != 0) + if (_Py_unlikely(level != 0)) { Py_FatalError(/* '(' */ "missing ')' in getargs format"); + } if (min < 0) min = max; @@ -327,7 +329,7 @@ vgetargs1_impl(PyObject *compat_args, Py if (max > STATIC_FREELIST_ENTRIES) { freelist.entries = PyMem_NEW(freelistentry_t, max); - if (freelist.entries == NULL) { + if (_Py_unlikely(freelist.entries == NULL)) { PyErr_NoMemory(); return 0; } @@ -366,7 +368,7 @@ vgetargs1_impl(PyObject *compat_args, Py } } - if (nargs < min || max < nargs) { + if (_Py_unlikely(nargs < min || max < nargs)) { if (message == NULL) PyErr_Format(PyExc_TypeError, "%.150s%s takes %s %d argument%s (%ld given)", @@ -388,15 +390,15 @@ vgetargs1_impl(PyObject *compat_args, Py msg = convertitem(stack[i], &format, p_va, flags, levels, msgbuf, sizeof(msgbuf), &freelist); - if (msg) { + if (_Py_unlikely(msg)) { seterror(i+1, msg, levels, fname, message); return cleanreturn(0, &freelist); } } - if (*format != '\0' && !Py_ISALPHA(Py_CHARMASK(*format)) && - *format != '(' && - *format != '|' && *format != ':' && *format != ';') { + if (_Py_unlikely(*format != '\0' && !Py_ISALPHA(Py_CHARMASK(*format)) && + *format != '(' && + *format != '|' && *format != ':' && *format != ';')) { PyErr_Format(PyExc_SystemError, "bad format string: %.200s", formatsave); return cleanreturn(0, &freelist); @@ -522,7 +524,7 @@ converttuple(PyObject *arg, const char * n++; } - if (!PySequence_Check(arg) || PyBytes_Check(arg)) { + if (_Py_unlikely(!PySequence_Check(arg) || PyBytes_Check(arg))) { levels[0] = 0; PyOS_snprintf(msgbuf, bufsize, toplevel ? "expected %d arguments, not %.50s" : @@ -533,7 +535,7 @@ converttuple(PyObject *arg, const char * } len = PySequence_Size(arg); - if (len != n) { + if (_Py_unlikely(len != n)) { levels[0] = 0; if (toplevel) { PyOS_snprintf(msgbuf, bufsize, @@ -554,7 +556,7 @@ converttuple(PyObject *arg, const char * const char *msg; PyObject *item; item = PySequence_GetItem(arg, i); - if (item == NULL) { + if (_Py_unlikely(item == NULL)) { PyErr_Clear(); levels[0] = i+1; levels[1] = 0; @@ -565,7 +567,7 @@ converttuple(PyObject *arg, const char * msgbuf, bufsize, freelist); /* PySequence_GetItem calls tp->sq_item, which INCREFs */ Py_XDECREF(item); - if (msg != NULL) { + if (_Py_unlikely(msg != NULL)) { levels[0] = i+1; return msg; } @@ -589,14 +591,16 @@ convertitem(PyObject *arg, const char ** format++; msg = converttuple(arg, &format, p_va, flags, levels, msgbuf, bufsize, 0, freelist); - if (msg == NULL) + if (_Py_likely(msg == NULL)) { format++; + } } else { msg = convertsimple(arg, &format, p_va, flags, msgbuf, bufsize, freelist); - if (msg != NULL) + if (_Py_unlikely(msg != NULL)) { levels[0] = 0; + } } if (msg == NULL) *p_format = format; diff -r 82d1c8d15e18 Tools/clinic/clinic.py --- a/Tools/clinic/clinic.py Mon Feb 06 10:41:46 2017 +0200 +++ b/Tools/clinic/clinic.py Mon Feb 06 10:27:12 2017 +0100 @@ -830,9 +830,9 @@ class CLanguage(Language): parser_prototype = parser_prototype_fastcall parser_definition = parser_body(parser_prototype, normalize_snippet(""" - if (!_PyArg_UnpackStack(args, nargs, "{name}", + if (_Py_unlikely(!_PyArg_UnpackStack(args, nargs, "{name}", {unpack_min}, {unpack_max}, - {parse_arguments})) {{ + {parse_arguments}))) {{ goto exit; }} @@ -861,8 +861,8 @@ class CLanguage(Language): parser_prototype = parser_prototype_fastcall parser_definition = parser_body(parser_prototype, normalize_snippet(""" - if (!_PyArg_ParseStack(args, nargs, "{format_units}:{name}", - {parse_arguments})) {{ + if (_Py_unlikely(!_PyArg_ParseStack(args, nargs, "{format_units}:{name}", + {parse_arguments}))) {{ goto exit; }}